我写了这篇帖子,请你帮我。 我的要求是在c#上下文中使用scard32.dll读写智能卡(sle4428)。读者是SCM Microsystem的SCR 3310
首先,我有一个运行正确的vb.net代码,我能够读写数据。 问题是我试图用c#做同样的事情。 我的第一个尝试是在c#中翻译本机调用“SCardComand”但是失败了。 第二个尝试是从VB.net代码构建一个DLL并在c#上下文中使用它但仍然失败。
如果我写这篇文章是因为我没有更多的想法。
按照我提供的VB.net本地电话
<DllImport("SCARD32", EntryPoint:="SCardComand", SetLastError:=True, CallingConvention:=CallingConvention.Winapi, CharSet:=CharSet.Ansi, ExactSpelling:=True)> _
Public Shared Function SCardComand(ByRef handle As Integer,
<MarshalAs(UnmanagedType.VBByRefStr)> ByRef cmd As String,
ByRef cmdLen As Integer,
<MarshalAs(UnmanagedType.VBByRefStr)> ByRef dataIn As String,
ByRef dataInLen As Integer,
<MarshalAs(UnmanagedType.VBByRefStr)> ByRef dataOut As String,
ByRef dataOutLen As Integer) As Integer
End Function
这里我的翻译为c#。
[DllImport("SCARD32.DLL")]
static extern UInt32 SCardComand(IntPtr handle,
[MarshalAs(UnmanagedType.LPTStr)] ref String cmd,
IntPtr cmdLen,
[MarshalAs(UnmanagedType.LPTStr)] ref String dataIn,
IntPtr dataInLen,
[MarshalAs(UnmanagedType.LPTStr)] out String dataOut,
IntPtr dataOutLen);
如果我在c#int Ret = SCardComand(0, "Card,MemVerifyPin,FFFFF", 0,"",0, "", 0);
中运行此命令,那么获得16384这对我来说毫无意义。
如果有人知道如何继续......
答案 0 :(得分:0)
我注意到的第一件事是你的C#错了
[DllImport("SCARD32.DLL")] static extern UInt32 SCardComand(IntPtr handle, [MarshalAs(UnmanagedType.LPTStr)] ref String cmd, IntPtr cmdLen, [MarshalAs(UnmanagedType.LPTStr)] ref String dataIn, IntPtr dataInLen, [MarshalAs(UnmanagedType.LPTStr)] out String dataOut, IntPtr dataOutLen);
应该是:
[DllImport("SCARD32.DLL")] static extern UInt32 SCardComand(int handle, [MarshalAs(UnmanagedType.LPTStr)] ref String cmd, IntPtr cmdLen, [MarshalAs(UnmanagedType.LPTStr)] ref String dataIn, int dataInLen, [MarshalAs(UnmanagedType.LPTStr)] out String dataOut, int dataOutLen);
原因是工作的VB.net代码不使用IntPtr for handle,dataInLen和dataOutLen,显然IntPtr!=整数。你得到16384的原因是因为你必须将IntPtr Marshall一个整数来实际得到正确的答案。
如果我的建议不起作用,那么发布这个命令的文档,就需要知道如何在C / C ++代码中声明原型,以便更多地提出替代方案。