在Excel VBA中访问DLL

nxagd54h  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(184)

我正在尝试从VBA访问一个函数,在一个包含以下信息的Dll中:

typedef struct I1_Device_* I1_DeviceHandle

表示i1设备句柄的不透明数据类型。
这种类型的句柄可以通过调用I1_GetDevices获得。
此设备句柄用于对特定设备示例执行操作。当完成设备句柄时,您应该调用I1_CloseDevice
功能文档:

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

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

**我认为问题出在关于opaque数据类型的declare语句中。我尝试了以下方法:

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

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

esyap4oy

esyap4oy1#

假设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位整数类型。因此它也被声明为LongVariant类型比简单的整数值更复杂,因此将返回类型声明为Variant是不正确的。
最后一点:handles实际上是一个数组,所以你也可以尝试这样声明:

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

相关问题