我有一个用Java编写的程序,它可以成功地与Java智能卡和智能卡读取器进行通信,使用javax.Smart Smart .*。通过使用API监视器,我发现运行java.exe的女巫实际上是在使用WinSCard winAPI (它在我开始通信时加载winscard.dll )。我还没有找到我们真正的电话)
我的问题是,我试图在Qt框架C++程序中使用WinSCard库实现相同的东西。如果我在读取器插入USB后10秒内运行程序,那么一切都能正常工作,但在那之后,阅读器进入了一个状态,我认为这是一些能量保存状态,然后几秒钟后,它就会从USB管道中发射下来。当我试图连接到它时,java程序会自动“唤醒”读者,但是我编写的C++没有,我也不知道我做错了什么。
首先我用SCardEstablishContext()调用建立上下文,然后用SCardListReaders()列出读取器,这实际上是问题,最后我调用SCardConnect()连接,如果智能卡读取器处于“睡眠”状态,返回SCARD_E_NOT_READY。
请注意,如果智能卡读卡器不是这种“睡眠”模式,我可以用相同的代码与卡片进行通信,没有问题。
在这种情况下,winAPI描述没有给出该做什么的提示,我也找不到该做什么的任何跟踪。如果有人知道这方面的解决方案,请分享!
发布于 2014-12-13 13:29:17
解决了这个问题。:缺少文档的windows或windows错误或糟糕的智能卡读卡器驱动程序实现。
SCardConnect() windows声明:
标志中的dwShareMode,指示其他应用程序是否可以与该卡形成连接。
SCARD_SHARE_SHARED:此应用程序愿意与其他应用程序共享此卡。SCARD_SHARE_EXCLUSIVE:此应用程序不愿意与其他应用程序共享该卡。SCARD_SHARE_DIRECT:这个应用程序正在为它的私用分配读取器,并将直接控制它。不允许其他应用程序访问它。
它的接缝是,在SCARD_SHARE_DIRECT的情况下,它也不允许访问任何用来唤醒睡着的阅读器的内容。在SCARD_SHARE_EXCLUSIVE或SCARD_SHARE_SHARED的情况下,它的作用就像一种魅力:读者在SCardConnect()上自动“醒来”。
发布于 2014-12-09 17:36:41
我这样做,使用下面的代码,它似乎工作得很好。(虽然它现在已经很旧了。)我要做的是:
int connectDevice(bool cardNeeded){
dwAP = 0;
log("\nEstablishing a connection to the device\n");
if (deviceConnected) {
log("Already connected.\n");
return 1;
}
hCard = NULL;
if (cardNeeded) {
lReturn = SCardConnect(hContext, (LPCTSTR)currentReader, SCARD_SHARE_SHARED, SCARD_PROTOCOL_Tx, &hCard, &dwAP );
if(SCARD_S_SUCCESS != lReturn){
logBytes(" SCardConnect failed with error: ", (byte *)&lReturn, sizeof(LONG));
return 0;
}
}
else {
lReturn = SCardConnect(hContext, (LPCTSTR)currentReader, SCARD_SHARE_DIRECT, 0, &hCard, &dwAP );
if(SCARD_S_SUCCESS != lReturn){
logBytes(" SCardConnect failed with error: ", (byte *)&lReturn, sizeof(LONG));
return 0;
}
}
deviceConnected = true;
logBytes(" SCardConnect succeeded, handle : ", (byte *)&hCard, sizeof(SCARDHANDLE));
log(" Successful\n");
return 1;
}https://stackoverflow.com/questions/27384898
复制相似问题