【发布时间】:2013-12-09 14:23:14
【问题描述】:
我一直在尝试在 C# 中使用非接触式 mifare 读卡器提供的 VB DLL,但是在传递变量类型时出现问题。原代码为:
READER_API int __stdcall RDR_LoginToSector(UCHAR Sector, UCHAR KeyType, unsigned char * KEY);
UCHAR 可以毫无问题地用作“uint”或“byte”,但是“unsigned char *”不起作用
我尝试将其称为各种类型:
[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 应用程序仔细检查了密钥,并且可以正确记录,并且它附带的编译源也可以与此密钥一起使用。
所有不需要“unsigned char *”的方法都可以正常工作,比如验证卡的类型,打开COM端口等等。
有什么想法吗?
谢谢大家。
【问题讨论】:
-
1) 字符串以 null 结尾(包括 +1 字符)。 2)字符串是Unicode! E.追加((字节)0xff);不会做你所期望的(你所有的例子都是如此。像你的第一个例子一样使用 System.Byte (但在末尾添加一个空终止符“0”)。
-
@Adriano mabye 一些代码会有所帮助
-
@MauricioGracia 我有点忙,所以我才发表评论!