我一直在嘗試使用非接觸式Mifare卡讀寫器提供的VB DLL,在C#DLL,但是有傳遞變量類型的問題。原來的代碼是:錯誤與「無符號字符*」進口的C#
READER_API int __stdcall RDR_LoginToSector(UCHAR Sector, UCHAR KeyType, unsigned char * KEY);
的UCHAR可以作爲「UINT」或「字節」沒有問題,但是「無符號字符*」不工作
我試圖調用它的各類:
[DllImport("SmartReader.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, IntPtr KEY);
byte[] D = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
IntPtr F = new IntPtr();
F = Marshal.AllocHGlobal(Marshal.SizeOf(D));
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, F);
[DllImport("SmartReader.dll", CallingConvention = CallingConvention.Cdecl] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, StringBuilder KEY);
StringBuilder E = new StringBuilder(6);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, E);
[DllImport("SmartReader.dll", CharSet = CharSet.Unicode)] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, byte[] KEY);
byte[] D = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, D);
[DllImport("SmartReader.dll", CharSet = CharSet.Unicode)] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, char[] KEY);
char[] C = { (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff };
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, C);
我也試過用「ref」語句沒有成功。
在所有的方法中,返回值是3,這意味着登錄失敗。我使用我正在工作並可以正確記錄的Android應用程序對密鑰進行雙重檢查,並且隨附的編譯源也可以使用此密鑰。
不需要「無符號的字符*」正常工作的所有方法,就像那些以驗證卡的類型,開放的COM端口和這樣。
任何想法?
謝謝大家。
1)字符串以null結尾(包括+1字符)。 2)字符串是Unicode的! E.Append((字節)爲0xFF);不會像你期望的那樣做(所有的例子都是如此)使用System.Byte就像你的第一個例子(但在末尾添加一個空終止符「0」) –
@Adriano mabye一些代碼將有助於 –
@MauricioGracia我'有點忙,這就是爲什麼我只發表評論! –