首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WinScard SCardConnect返回SCARD_E_NOT_READY

WinScard SCardConnect返回SCARD_E_NOT_READY
EN

Stack Overflow用户
提问于 2014-12-09 17:19:12
回答 2查看 5.1K关注 0票数 1

我有一个用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描述没有给出该做什么的提示,我也找不到该做什么的任何跟踪。如果有人知道这方面的解决方案,请分享!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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()上自动“醒来”。

票数 4
EN

Stack Overflow用户

发布于 2014-12-09 17:36:41

我这样做,使用下面的代码,它似乎工作得很好。(虽然它现在已经很旧了。)我要做的是:

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27384898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档