1

除了我希望移除非接触式卡“A”并将其替换为非接触式卡“B”之外,我的应用程序在所有方面都正常工作。

一旦存在卡 B,我将运行以下 PCSC 功能:

    lResult = PCSC.SCardDisconnect(hCard, SCARD_RESET_CARD)
    lResult = PCSC.SCardReleaseContext(hContext)
    lMode = SCARD_SHARE_EXCLUSIVE
    lProtocol = SCARD_PROTOCOL_T0

    lResult = PCSC.SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, hContext)

    If lMode = SCARD_SHARE_DIRECT Then
        lResult = PCSC.SCardConnect(hContext, ConnReaderName, lMode, 0, hCard, lActiveProtocol)
    Else
        lResult = PCSC.SCardConnect(hContext, ConnReaderName, lMode, lProtocol, hCard, lActiveProtocol)
    End If

尽管此代码断开连接、释放上下文、重新建立上下文并重新连接到卡,但我似乎收到 8010000f 协议不匹配错误。两张牌都是T=0。经过多次测试,我发现真正起作用的唯一方法是在将非接触式卡B引入现场后等待大约10秒无活动,然后读卡器的活动灯再次闪烁,似乎重置卡并允许交易进行像往常一样前进。

为什么会这样?有没有办法让我尽快强制最终重置?

我确实将 ScardDisconnect 和 ScardReleaseContext 命令分开,在非接触式卡 A 仍在现场时执行它们,但没有任何区别。

4

1 回答 1

0

这是一个可能的解决方案:

在直接模式下建立新连接,然后在共享/独占模式下重新连接,强制重置卡或卡断电

ret = SCardConnect(hContext, readername, lMode, SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
if (ret == SCARD_E_PROTO_MISMATCH) {
    ret = SCardConnect(hContext, readername, SCARD_SHARE_DIRECT, 0, &hCard, &dwActiveProtocol);
    if (!ret) ret = SCardReconnect(hCard, lMode, SCARD_PROTOCOL_T0, SCARD_RESET_CARD, &dwActiveProtocol);
}
于 2020-12-04T10:01:42.433 回答