tags:

views:

91

answers:

3

I use Philip's MfRc500.dll for communicating with RFID chips. It contains a function for reading data, which is defined like this:

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

I use it in VB.NET like this:

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

and then a wrapper:

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

The second parameter in function Mf500PiccRead can returns "16 byte data block", so my long data type is too small. If I use byte() instead of long, then i get ExecutionEngineException Exception.

Which data type should I use and how?

A: 

Hi there, try and use an Int or Integer instead of a short.

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

Public Function PiccRead(ByVal addr As UShort, ByRef value As Long) As Int o r Integer Return RFID_PiccRead(addr, value) End Function

Zyon
I don't think the problem is in return data type of the function, but in the data type of the second parameter...
_simon_
I think it's the second parameter **and** the return type **and** the first parameter :)
MarkJ
A: 

A char is equivalent to a Byte so some other parts of your declaration are also wrong.

I recommend you use the PInvoke Interop Assistant to automatically convert the C header into VB.Net PInvoke declarations.

However I don't have that installed here, so just for fun I've attempted a manual conversion. In any case, the assistant isn't psychic, so it won't know the second argument can return 16 bytes, and you'll need to do a little manual tweaking anyway.

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

Make sure to pass a 16-byte array for the second parameter and I think it should work.

MarkJ
Thanks! PInvoke Interop Assistant looks very interesting... :)
_simon_
+2  A: 

The last argument really is a Byte(). ExecutionEngineException indicates that the garbage collected heap got corrupted. Be sure to pass an initialized array that's large enough to contain the response:

    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
Hans Passant