我的应用程序在各个方面都工作正常,除了当我希望删除非接触式卡'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仍在该字段时执行它们,但没有区别。
这是一个可能的解决方案:
以直接模式建立新的连接,然后以共享/独占模式重新连接,强制卡复位或卡断电
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);
}