来自外部DLL的数据类型问题

时间:2010-02-25 11:11:33

标签: .net vb.net dll

我使用Philip的MfRc500.dll与RFID芯片进行通信。它包含一个读取数据的函数,其定义如下:

signed char Mf500PiccRead(unsigned char addr, unsigned char * data)

我在VB.NET中使用它如下:

Private Declare Function RFID_PiccRead Lib "MfRc500.dll" Alias "_Mf500PiccRead@8" (ByVal addr As UShort, ByRef value As Long) As Short

然后是一个包装器:

Public Function PiccRead(ByVal addr As UShort, ByRef value As Long) As Short
    Return RFID_PiccRead(addr, value)
End Function

函数Mf500PiccRead中的第二个参数可以返回“16字节数据块”,因此我的长数据类型太小。如果我使用byte()而不是long,那么我得到ExecutionEngineException异常。

我应该使用哪种数据类型以及如何使用?

3 个答案:

答案 0 :(得分:3)

最后一个参数确实是Byte()。 ExecutionEngineException指示垃圾收集堆已损坏。一定要传递一个足够大的初始化数组来包含响应:

    Dim buffer(666) As Byte
    Dim retval As SByte = RFID_PiccRead(42, Buffer)
...
  Private Declare Function RFID_PiccRead Lib "MfRc500.dll" Alias "_Mf500PiccRead@8" _
     (ByVal addr As Byte, Byval buffer() As Byte) As SByte

答案 1 :(得分:1)

char相当于Byte,因此声明的其他部分也是错误的。

我建议您使用PInvoke Interop Assistant自动将C标头转换为VB.Net PInvoke声明。

但是我没有在这里安装,所以为了好玩,我尝试了手动转换。在任何情况下,助手都不是通灵的,因此它不会知道第二个参数可以返回16个字节,并且无论如何你都需要做一些手动调整。

Private Declare Function RFID_PiccRead Lib "MfRc500.dll" _ 
  Alias "_Mf500PiccRead@8" (ByVal addr As Byte, ByRef value() As Byte) As Byte 

确保为第二个参数传递一个16字节的数组,我认为它应该可以工作。

答案 2 :(得分:0)

尝试使用Int或Integer而不是short。

私有声明功能RFID_PiccRead Lib“MfRc500.dll”别名“_Mf500PiccRead @ 8”(ByVal addr As UShort,ByRef value As Long)作为Int或使用Integer

Public Function PiccRead(ByVal addr As UShort,ByRef value As Long)As Int o r Integer     返回RFID_PiccRead(addr,value) 结束功能