在Excel VBA中访问DLL

时间:2014-03-14 15:37:29

标签: excel-vba dll vba excel

我正在尝试从具有以下信息的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指针。所使用的记忆   数组由库维护,因此不要试图释放它   记忆。数组中的条目数以计数形式返回。

     

此数组中返回的句柄无法在大多数APIS中使用   直到通过调用I1_OpenDevice打开。你不需要打电话   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 :(得分: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)传递,而不是通过值传递({{1} })。 ByVal是一个32位指针,因此它被声明为I1_DeviceHandle,因为Long是一个32位整数类型。 Long可能是32位无符号整数,因此它也被声明为I1_UIntegerLong类型比简单的整数值更复杂,因此将返回类型声明为Variant是不正确的。

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

handles