一个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。然后我们通过RDP.
从COMP_B连接到COMP_A。正确的结果必须是列表中有READER_B。但应用程序“崩溃”,因为SCardListReaders
返回SCARD_E_SERVICE_STOPPED.
一些瞪眼回答我们需要重新建立背景。所以循环的新版本:
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
。但我不确定这是否正确,也不适合切换用户。