我使用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异常。
我应该使用哪种数据类型以及如何使用?
答案 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) 结束功能