2010-02-25 24 views
3

我使用Philip的MfRc500.dll與RFID芯片進行通信。它包含了讀取數據的功能,它是這樣定義的:來自外部DLL的數據類型問題

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

我用它在VB.NET這樣的:

Private Declare Function RFID_PiccRead Lib "MfRc500.dll" Alias "[email protected]" (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

最後一個參數確實是一個Byte()。 ExecutionEngineException指示垃圾收集堆已損壞。一定要傳遞一個初始化數組是大到足以容納響應:

Dim buffer(666) As Byte 
    Dim retval As SByte = RFID_PiccRead(42, Buffer) 
... 
    Private Declare Function RFID_PiccRead Lib "MfRc500.dll" Alias "[email protected]" _ 
    (ByVal addr As Byte, Byval buffer() As Byte) As SByte 
0

嘗試使用Int或Integer而不是簡寫。

私人聲明函數庫RFID_PiccRead 「MfRc500.dll」 別名 「_Mf500PiccRead @ 8」(BYVAL地址與ushort,爲ByRef值,只要)int或使用整數

公共功能PiccRead(BYVAL地址與ushort,爲ByRef值長)int或整型 返回RFID_PiccRead(地址,值) 端功能

+0

我不認爲這個問題是在函數返回的數據類型,但在第二個參數的數據類型... – sventevit 2010-02-25 11:20:12

+0

我認爲這是第二個參數**和**返回類型**和**第一個參數:) – MarkJ 2010-02-25 11:25:16

1

一個char相當於Byte讓你聲明的其他一些地方也是錯誤的。

我建議你使用PInvoke Interop Assistant自動將C頭轉換爲VB.Net PInvoke聲明。

但是我沒有在這裏安裝,所以只是爲了好玩,我嘗試過手動轉換。在任何情況下,助理都不是通靈,所以它不會知道第二個參數可以返回16個字節,無論如何你需要做一些手動調整。

Private Declare Function RFID_PiccRead Lib "MfRc500.dll" _ 
    Alias "[email protected]" (ByVal addr As Byte, ByRef value() As Byte) As Byte 

請確保爲第二個參數傳遞一個16字節的數組,我認爲它應該工作。

+0

謝謝! PInvoke Interop Assistant看起來很有趣... :) – sventevit 2010-02-25 11:48:34