0

一个 Windows 应用程序可与智能卡读卡器配合使用。它有这样的循环:

do{
lErr = SCardListReaders( hContext, ... );
if ( lErr != SCARD_S_SUCCESS )
    return 1;
//Show readers
}while(!stop)

即它获取当前的读者列表,而不是显示它。问题是这不适用于RDP连接。假设我们有计算机 A (COMP_A) 和智能卡读卡器 A (READER_A),计算机 B (COMP_B) 和读卡器 B (READER_B)。该应用程序在 COMP_A 上启动,并在阅读器列表中显示 READER_A。然后我们通过 COMP_B 连接到 COMP_ARDP.正确的结果必须是列表中有 READER_B。但是应用程序“崩溃”了,因为SCardListReaders返回SCARD_E_SERVICE_STOPPED. Some goggling 给出了我们需要重新建立上下文的答案。所以新版本的循环:

do{
lErr = SCardListReaders( hContext, ... );
if ( lErr == SCARD_E_SERVICE_STOPPED )
{
    SCardReleaseContext( hContext );
    //Sleep(10000)
    SCardEstablishContext( ..., &hContext );
    lErr = SCardListReaders( hContext, ... );
}
if ( lErr != SCARD_S_SUCCESS )
    return 1;
//Show readers
}while(!stop)

它不起作用,SCardListReaders在列表中返回 READER_A。我想是因为SCardEstablishContext在最终设置 RDP 连接之前新的结束。至少如果 Sleep 未注释它可以正常工作。与用户切换的情况类似,即当用户选择“切换用户”时SCardListReaders返回。SCARD_E_SERVICE_STOPPED

问题是如何制作正确的代码?如何判断这是RDP连接还是用户切换?如何重新建立scard context?

实际上我做了一些改变,这些改变使用WTSQuerySessionInformation了带WTSClientProtocolType参数的函数。我等什么时候WTSClientProtocolType = 2再打电话SCardEstablishContext。但我不确定这是否正确,对于切换用户也不正确。

4

0 回答 0