Scard32.dll和类似的

时间:2011-02-11 07:54:02

标签: c# vb.net smartcard-reader

我写了这篇帖子,请你帮我。 我的要求是在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这对我来说毫无意义。

如果有人知道如何继续......

1 个答案:

答案 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 ++代码中声明原型,以便更多地提出替代方案。