1

我有一个 Java 程序,它使用 javax.smartcardio.* 成功地与带有智能卡读卡器的 Java 智能卡通信。通过 API 监视器,我发现运行它的 java.exe 女巫实际上是在使用 WinSCard winAPI(它在我开始通信的那一刻加载了 winscard.dll。我还没有设法找到我们的实际调用)

我的问题是我尝试使用 WinSCard 库在 Qt 框架 C++ 程序中实现相同的东西。如果我在阅读器插入 USB 后 10 秒内运行程序,一切正常,但在那之后阅读器进入我认为是某种节电状态的状态,然后几秒钟后它击落了 USB 管道。java程序在我尝试连接时会自动“唤醒”阅读器,但我写的C++没有,我也不知道自己做错了什么。

SCardEstablishContext()首先我用调用建立一个上下文,然后用 列出读卡器SCardListReaders(),它实际上列出了读卡器是问题,最后我调用SCardConnect()连接,SCARD_E_NOT_READY如果智能卡读卡器处于这种“睡眠”状态,则返回。

请注意,如果智能卡读卡器不是这种“睡眠”模式,我可以用相同的代码与卡通信,没有问题。

winAPI 描述没有提示在这种情况下要做什么,我找不到任何线索。如果有人知道这个问题的解决方案,请分享!

4

2 回答 2

4

苦难解决了。:未记录的 windows api 或 windows api 错误或坏的智能卡读卡器驱动程序实现。

SCardConnect() windows api 声明:

dwShareMode [in] 指示其他应用程序是否可以与卡建立连接的标志。

SCARD_SHARE_SHARED:此应用愿意与其他应用共享卡片。SCARD_SHARE_EXCLUSIVE:此应用程序不愿意与其他应用程序共享卡。SCARD_SHARE_DIRECT:此应用程序正在分配阅读器供其私人使用,并将直接控制它。不允许其他应用程序访问它。

它接缝在 SCARD_SHARE_DIRECT 的情况下,它也不允许访问旨在唤醒睡眠读者的任何内容。在 SCARD_SHARE_EXCLUSIVE 或 SCARD_SHARE_SHARED 的情况下,它就像一个魅力:阅读器在 SCardConnect() 上自动“唤醒”。

于 2014-12-13T13:29:17.033 回答
1

我这样做了,使用以下代码,它似乎工作正常。(虽然它现在已经很老了。)这就是我所做的:

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;
}
于 2014-12-09T17:36:41.773 回答