我正在开发一个C ++应用程序(在Windows 7上),它与PC / SC卡读卡器连接以执行一些身份验证操作。这个应用程序是另一个应用程序的子进程(我不知道这是否相关,但它可能是)。
我还有一个简单的独立测试应用程序,可以执行我需要的智能卡的所有交互,并且成功完成。但是,当将此实用程序中的代码集成到我的主应用程序中时,我遇到了一些奇怪的行为。
特别是我发送给卡的第一个命令是SELECT FILE命令:
0x00 0xa4 0x04 0x00 ...
对此命令的响应与我的独立测试实用程序相同:
0x61 0x13
由于这表明有更多可用的响应字节,我发送GET RESPONSE命令:
0x00 0xc0 0x00 0x00 0x13
此命令失败,并显示指示无效的错误:
0x6d 0x00
然而,我的测试工具(使用相同的读卡器和同一张卡运行)会收到成功的响应(例如以... 0x90 0x00
结尾)。然而,测试应用程序要求智能卡在启动时处于读卡器中(它是一个简单的应用程序,它启动,执行它需要的,然后存在)。如果卡在启动时在读卡器中(就像我的测试读卡器一样),我在实际应用中描述的错误就不会发生。
有没有人有任何想法可能是这个问题的根源。该卡确实支持给定的指令代码,因为在某些情况下它会成功响应它。卡是好的(它按预期响应初始SELECT FILE命令)。我不认为这是一个权限问题(再次,它在启动时工作)。我的主要应用程序是多线程的,但所有卡交互都发生在一个线程上。我很茫然。任何建议都将不胜感激。
我注意到的另一件事是,在成功的情况下(例如,当应用程序启动时读卡器中的卡),GET RESPONSE在不成功的情况下需要约0.05秒(例如,卡片在插入后的某个时间插入应用程序启动)需要约2秒钟。
答案 0 :(得分:1)
您所遇到的可能与智能卡的Windows 7即插即用有关。这种即插即用功能在插入读卡器后立即自动将一大堆命令发送到卡中。如果您的应用程序当时也开始发送命令,这可能会导致您的命令与即插即用的命令交错。
因此,您可能希望在开始发送命令之前将卡插入读卡器后等待几秒钟,或者打开读卡器以进行独占访问。
对于独占访问权限,请使用值SCARD_SHARE_EXCLUSIVE
作为dwShareMode
的参数SCardConnect
。