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# 即用型类? [关闭]