SCardEstablishContext作为服务挂起

时间:2009-04-14 15:45:11

标签: windows delphi windows-services

为什么SCardEstablishContext在从服务调用时可能会挂起,永远不会返回?

我的代码在许多Windows安装中都能正常运行。它访问Cherry键盘的智能卡读卡器(6x44)以读取智能卡上的数据。它在大多数尝试过的PC上运行良好。但是,在某些使用西班牙语Windows在西班牙运行的PC上,SCardEstablishContext函数永远不会返回。我无法理解为什么会这样。我记录了它的任何一面,但它后面的日志条目没有出现。然后我无法将其关闭(工作线程卡住),并且必须将其关闭。

如果从应用程序而不是服务运行,完全相同的线程代码可以正常工作。提供用户的服务登录设置而不是系统没有区别。 我在这台机器上安装了西班牙语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

1 个答案:

答案 0 :(得分:2)

可能有不同的原因导致API函数挂起,例如死锁,或者等待用户输入的不可见消息框或对话框。您应该尝试获取堆栈跟踪using WinDbg

您还应确保尝试在同一环境中重现该错误。重要的一点可能是快速用户切换是否处于活动状态以及其他用户是否已登录,以及是否有相同的设备驱动程序和服务正在运行。