为什么SCardEstablishContext挂起,从服务中调用时永远不会返回?
我有很多Windows安装正常工作的代码。 它访问Cherry键盘的智能卡读卡器(6×44)以读取智能卡上的数据。 它在大多数电脑上都能正常工作。 但是,在一些使用西class牙语Windows在西class牙运行的PC上,SCardEstablishContext函数永远不会返回。 我不知道为什么会这样。 我有日志logging的任何一方,但没有出现后的日志条目。 我不能closures它(工作线程卡住了),并不得不杀死它。
如果从应用程序运行而不是服务,则完全相同的线程代码工作正常。 给用户的服务login设置,而不是系统没有区别。 我已经在这台机器上安装了西class牙语的XP,但它工作得很好。 远端具有相同的Winscard.dll版本,我在这里(都在XP SP3状态)。 事件日志中没有显示错误。
我怎样才能弄清楚什么是错误的,什么可能会修复它? (下面的Delphi代码)
// based on code by Norbert Huettisch function TPCSCConnector.Init: boolean; var RetVar: LongInt; ReaderList: string; ReaderListSize: integer; v: array[0..MAXIMUM_SMARTCARD_READERS] of string; i: integer; begin Result := false; FNumReaders := 0; {$IFDEF MJ_ONLY} LogReport(leInformation, 'About to call SCardEstablishContext'); {$ENDIF} RetVar := SCardEstablishContext(SCARD_SCOPE_USER, nil, nil, @FContext); {$IFDEF MJ_ONLY} // never gets to report this (and logging known good etc) LogReport(leInformation, 'SCardEstablishContext result = ' + IntToStr(RetVar)); {$ENDIF} if RetVar = SCARD_S_SUCCESS then begin
API函数似乎挂起的原因可能有所不同,例如死锁,或者等待用户输入的不可见消息框或对话框。 你应该尝试使用WinDbg来获取堆栈跟踪 。
您还应该确保您正在尝试在相同的环境中重现该错误。 重要的一点可能是快速用户切换是否处于活动状态以及是否有其他用户登录,同时还有相同的设备驱动程序和服务正在运行。