Scard32.dll 和类似的

Posted

技术标签:

【中文标题】Scard32.dll 和类似的【英文标题】:Scard32.dll and similar 【发布时间】:2011-02-11 07:54:02 【问题描述】:

我写这篇文章是为了请求你帮助我。 我的要求是在 c# 上下文中使用 scard32.dll 读取和写入智能卡 (sle4428)。阅读器为单片机微系统的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,这对我来说毫无意义。

如果有人知道如何进行,请...

【问题讨论】:

在VB中运行命令会得到什么?你期望得到什么对你来说意味着什么? 16384 有什么问题?这是一个很好的数字! 嗨,丹,当我在 vb.net 中运行并且 PIN 码正确时,我得到了 0。 【参考方案1】:

我注意到的第一件事是你的 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 作为句柄、dataInLen 和 dataOutLen,显然 IntPtr != integer。您得到 16384 的原因是因为您必须将 IntPtr 编组为整数才能真正得到正确答案。

如果我的建议不起作用,请发布此命令的文档,需要知道原型是如何在 C/C++ 代码中声明的,以便更有可能提出替代方案。

【讨论】:

嗨 Ramhoud,非常感谢您的回答,我也将此添加到声明 [return: MarshalAs(UnmanagedType.U4)] 但不幸的是,没有运气值是相同的......我真的不知道。

以上是关于Scard32.dll 和类似的的主要内容,如果未能解决你的问题,请参考以下文章

系统提示缺少libeay32.dll和ssleay32.dll怎么办

如何使用 WinApi/user32.dll 或类似的东西远程执行 ListBox 的 ListBox1_DoubleClick 事件?

是否有从 USER32.DLL 导入所有内容的 C# 即用型类? [关闭]

ADVAPI32.dll

如何包含我的非托管 dll 需要的 dll,例如 kernel32.dll

系统提示缺少libeay32.dll和ssleay32.dll怎么办