Windows 上的 PCSC-Lite 代码

Posted

技术标签:

【中文标题】Windows 上的 PCSC-Lite 代码【英文标题】:PCSC-Lite Codes on Windows 【发布时间】:2009-11-22 03:14:25 【问题描述】:

我已经成功构建了一个可以在 Linux 上使用 Qt 读取 Mifare 1K 卡的程序。所以现在,我希望它在 Windows 上运行。据我所知,Windows 上没有 PCSC-Lite 端口,我需要使用 Windows SDK 中的 winscard。我已经下载了它,我在 Windows 中的 Qt(使用 MingW)中有很多未定义的参考错误。例如:

release/ReadCard.o:ReadCard.cpp:(.text+0x48e): undefined reference to `pcsc_stringify_error' release/ReadCard.o:ReadCard.cpp:(.text+0x5e9): undefined reference to `pcsc_stringify_error' release/ReadCard.o:ReadCard.cpp:(.text+0x7ed): undefined reference to `pcsc_stringify_error' release/ReadCard.o:ReadCard.cpp:(.text+0x2e56): 未定义对“SCardListReaderGroups”的引用 release/ReadCard.o:ReadCard.cpp:(.text+0x3adc): 对“SCardListReaders”的未定义引用 release/ReadCard.o:ReadCard.cpp:(.text+0x3cc6): 未定义的对“SCardListReaders”的引用 发布/ReadCard.o:ReadCard.cpp:(.text+0x3f88): 未定义对“SCardGetStatusChange”的引用 release/ReadCard.o:ReadCard.cpp:(.text+0x4274): 未定义对“SCardConnect”的引用 release/ReadCard.o:ReadCard.cpp:(.text+0x4d1b): 未定义引用`SCardGetStatusChange

我也尝试在项目中指定这些库,但仍然失败。

LIBS += -lwinscard -lpcsclite WinSCard.Lib

【问题讨论】:

【参考方案1】:

从理论上讲,pcsc-lite 是 Windows PC/SC 堆栈到 UNIX 机器的一个端口。 Windows PC/SC 实现是 pcsc-lite 模仿的“参考实现”。并非所有 Windows SCard 功能都在 pcsc-lite 中实现,甚至存在细微差别,记录在 pcsc-lite documentation

不知道 Qt 的细节,但有一些注意事项:

pcsc_stringify_error 是 pcsc-lite 特定功能。它在 Windows 中不存在 Windows 或 mingw 上没有 pcsclite 库,因此您可能需要不同的 Windows 构建文件。 看看 OpenSC 以及它是如何工作的 makes use of PC/SC(-lite),如果你正在使用 mingw 构建,看看 "build" project。您可能也会对来自 OpenSC 的internal-winscard.h 感兴趣。

除了pcsc_stringify_error,您的问题在于通用 Windows 链接和 Qt (qmake?) 构建系统。

【讨论】:

我已删除 pcsc_stringify_error 但正如预期的那样,我仍然遇到其他错误。我不确定如何在我的项目中实现 OpenSC,即使它看起来很相似。你能详细说明一下吗?顺便说一句,我尝试在 Visual C++ .Net 中进行编码,当我使用 #include 时没有出现错误,我可以毫无问题地使用 SCardEstablishContext,但是在 Qt 中使用该代码时出现错误。 这已经是关于 Qt 而不是 PC/SC 的问题了。帮不了你,知道你的工具。【参考方案2】:

已经有一段时间了,我已经设法使用阅读器附带的示例中的标题解决了这个问题。我的 .pro 文件如下所示

win32 HEADERS += MainWindow.h \ ReadCard.h \ Config.h INCLUDEPATH += C:/Omnikey/Include LIBS += C:/Omnikey/Lib/winscardn.lib unix HEADERS += MainWindow.h \ wintypes.h \ winscard.h \ reader.h \ pcsclite.h \ ReadCard.h \ Config.h LIBS += -lpcsclite

我不确定这个解决方案是否可以与其他类型的阅读器一起使用,但它确实解决了我的问题。

【讨论】:

【参考方案3】:

我遇到了同样的问题,无法将 Windows SDK 中的 winscard 与 minGW 编译器一起使用。 一个快速的解决方法是使用 MSVC++ 编译器(如果您可以访问它。)而不是 minGW(您还需要使用 MSVC++ 编译器构建 Qt 本身)。

也许它也可以与 minGW 一起使用,但我没有进一步研究它..

【讨论】:

更新:刚刚发现不再需要使用 msvc 重新构建 Qt,您可以在此处下载预构建版本:qt.nokia.com/downloads/windows-cpp-vs2008。只需安装并配置 Qt Creator 以使用此 Qt 版本进行构建,就可以了

以上是关于Windows 上的 PCSC-Lite 代码的主要内容,如果未能解决你的问题,请参考以下文章

linux 虚拟机安装 pcsc-lite & ccid & libusb 无法检测到CCID KEY设备

PowerShell:在Windows 10中为Wi-Fi网络生成QR代码

Windows Server 2012 Essentials 上的 IIS 在哪里

从Google Cloud Compute上的Windows Server映射Windows上的共享文件夹

在 Windows 10 中禁用 Python 上的 USB 设备

使用 COM 在 Windows 上的本地计算机上进行进程间通信