【问题标题】:ERROR_INVALID_HANDLE in .NET app with winscard.dll带有 winscard.dll 的 .NET 应用程序中的 ERROR_INVALID_HANDLE
【发布时间】:2012-05-17 12:27:26
【问题描述】:

我正在创建一个 .NET Windows 服务来与智能卡读卡器进行通信。主要组件是一个名为 winscard.dll 的 Windows DLL,我在 .NET 代码中使用 DLLImport 属性。在 Windows XP 32 位上一切正常,但是当我在 Windows 7 x64 上运行它时,我在调用 SCardTransmit 时收到 0x6 ERROR_INVALID_HANDLE 结果。应用程序(作为命令行应用程序的服务)可以连接到读卡器,但不能从卡中读取任何内容。

有什么想法吗?

【问题讨论】:

  • 您是否尝试过将 .NET 应用程序构建为 32 位程序而不是 anycpu?
  • 如果我将其构建为 32 位应用程序,则:未处理的异常:System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。在 Microsoft.Win32.Win32Native.CoTaskMemFree(IntPtr ptr) 在 SmartCard.SmartCardBase.SCardListReaderGroups(Int32 hContext, String& cGro ups, Int32& nStringSize) 在 SmartCard.SmartCardBase.InitializeCardReader() 在 C:\Data\K7 Intranet\Smar tCard\SmartCardBase .cs:C:\Data\K7 Intranet\SmartCard\Program 中 SmartCard.Program.Main(String[] args) 的第 152 行.cs:第 14 行
  • 看来你不是唯一一个 (groupsrv.com/dotnet/about280604.html)。它并没有比你已经拥有的更多信息。
  • 解决方法:使用 IntPtr 代替 int (任何类型)并实现所有 winscard.dll 方法好,求助:pinvoke.net

标签: .net windows 64-bit winscard


【解决方案1】:

SCardEstablishContext 有问题,它会返回 0,但也会处理 0。使用 IntPtr 而不是 Integer

Public Declare Function SCardEstablishContext Lib "Winscard.dll" (ByVal dwScope As Integer, _
                                                                      ByVal pvReserved1 As Integer, _
                                                                      ByVal pvReserved2 As Integer, _
                                                                      ByRef phContext As IntPtr) As Integer

phContext 将在 Windows x64 中存储有效值(Windows 8 x64 和 Windows 2008 通过 RDP 测试)。将其他“Integer”用作句柄时也将其替换为“IntPtr”。

Public Declare Function SCardConnect Lib "Winscard.dll" Alias "SCardConnectA" (ByVal hContext As IntPtr, _
                                                                                   ByVal szReaderName As String, _
                                                                                   ByVal dwShareMode As Integer, _
                                                                                   ByVal dwPrefProtocol As Integer, _
                                                                                   ByRef hCard As IntPtr, _
                                                                                   ByRef ActiveProtocol As IntPtr) As Integer

【讨论】:

  • 是的,这就是解决方案。
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2011-06-12
  • 2015-02-01
相关资源
最近更新 更多