首页 文章

在Excel VBA中访问DLL

提问于
浏览
0

我正在尝试从具有以下信息的Dll中访问VBA中的函数:

typedef struct I1_Device_* I1_DeviceHandle

表示i1设备句柄的opaque数据类型 .

可以通过调用 I1_GetDevices 获得此类型的句柄 .

此设备句柄用于在特定设备实例上执行操作 . 完成设备句柄后,您应该调用 I1_CloseDevice .

功能文档:

I1_API I1_ResultType I1_GetDevices( I1_DeviceHandle ** devices,
                                    0I1_UInteger * count );

获取指向当前连接到计算机的设备的设备句柄数组的指针 . 参数[out]设备指向设备句柄的内部静态数组的指针[out]计算数组中的条目数返回成功时的eNoError每个句柄代表一个连接的设备 . 如果设备已关闭或断开连接,则句柄将变为无效 . I1_GetDevices的每次后续调用都将使前一次调用返回的数组无效 . 数组中的最后一个条目是NULL指针 . 数组使用的内存由库维护,因此请勿尝试释放此内存 . 数组中的条目数以计数形式返回 . 在通过调用I1_OpenDevice打开之前,此数组中返回的句柄在大多数APIS中无效 . 您不需要在数组中返回的句柄上调用I1_CloseDevice,除非您已通过I1_OpenDevice显式打开它们

.

**我认为问题出在关于opaque数据类型的声明语句中 . 我尝试过以下方法:

Public Declare Function I1_GetDevices Lib "C:\i1Pro.dll" (ByVal I1_DeviceHandle,
                                                          ByVal I1_UInteger)
               As Variant

并得到一个错误49.任何帮助?**

1 回答

  • 0

    假设 I1_ResultType 是整数类型,请在VBA中尝试此声明:

    Public Declare Function I1_GetDevices Lib "C:\i1Pro.dll" _
        (ByRef handles as Long, ByRef count as Long) As Long
    

    devicescount 都是 I1_GetDevices 函数的输出参数,因此它们通过引用( ByRef )传递,而不是通过值( ByVal )传递 . I1_DeviceHandle 是一个32位指针,因此它被声明为 Long ,因为 Long 是一个32位整数类型 . I1_UInteger 可能是32位无符号整数,因此它也被声明为 Long . Variant 类型比简单的整数值更复杂,因此将返回类型声明为Variant是不正确的 .

    最后一点: handles 实际上是一个数组,所以你也可以尝试这个声明:

    Public Declare Function I1_GetDevices Lib "C:\i1Pro.dll" _
        (ByRef handles as Long(), ByRef count as Long) As Long
    

相关问题