Windows 应用程序使用智能卡读卡器与RDP和交换用户
一个windows应用程序与智能卡读卡器配合使用。它有这样的循环:Windows 应用程序使用智能卡读卡器与RDP和交换用户,windows,smartcard,rdp,Windows,Smartcard,Rdp,一个windows应用程序与智能卡读卡器配合使用。它有这样的循环: do{ lErr = SCardListReaders( hContext, ... ); if ( lErr != SCARD_S_SUCCESS ) return 1; //Show readers }while(!stop) i、 它获取当前的读者列表,然后显示。 问题是,这在RDP连接中无法正常工作。假设我们有带智能卡读卡器A(读卡器A)的计算机A(COMP_A),带读卡器B(读卡器B)的计算机B(COMP_B
do{
lErr = SCardListReaders( hContext, ... );
if ( lErr != SCARD_S_SUCCESS )
return 1;
//Show readers
}while(!stop)
i、 它获取当前的读者列表,然后显示。
问题是,这在RDP
连接中无法正常工作。假设我们有带智能卡读卡器A(读卡器A)的计算机A(COMP_A),带读卡器B(读卡器B)的计算机B(COMP_B)。该应用程序在COMP_A上启动,并在读卡器列表中显示读卡器A。然后我们通过RDP从COMP_B连接到COMP_A。
正确的结果必须是列表中有READER_B。但是应用程序“崩溃”,因为SCardListReaders
返回SCARD\u E\u服务已停止。
一些人目瞪口呆地回答说,我们需要重新建立上下文。因此,新版本的循环:
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。我想是因为新的scardesttablishcontext
在RDP连接最终设置之前就结束了。至少,如果睡眠没有注释,它是正确的。
用户切换时的类似情况,即当用户选择“切换用户”时,scaddlistreaders
返回SCARD\u e\u SERVICE\u STOPPED
问题是如何生成正确的代码?如何确定这是RDP连接还是用户切换?如何重新建立scard上下文?
实际上,我做了一些更改,使用了带有
WTSClientProtocolType
参数的WTSQuerySessionInformation
函数。我在WTSClientProtocolType=2
时等待,然后调用scardesttablishcontext
。但我不确定这是正确的,而且对于切换用户也是不正确的。< /P>请提供完整的源代码,参数有时会对(例如系统或用户上下文)测试VisualStudio C++ 2008项目在这里。单击“ScardestStablishContext”,“运行线程”。这将启动显示读卡器列表的线程。在“运行线程”之前选中“睡眠”复选框,以便在重新建立上下文之前启用睡眠(10000)。