我正在开发一个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秒钟的时间。
您遇到的情况可能与Windows 7的智能卡即插即用有关。该即插即用功能在将卡插入读卡器后立即自动向卡发送一堆命令。如果此时您的应用也开始发送命令,则可能导致您的命令与即插即用命令交错。
因此,您可能要尝试在将卡插入读卡器后等待几秒钟,然后再开始发送命令,或者打开读卡器以进行独占访问。
对于独占访问,使用值SCARD_SHARE_EXCLUSIVE
的参数dwShareMode
的SCardConnect
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句