2009-04-14 93 views
2

当从服务调用SCardEstablishContext时,为什么会挂起,从不返回?SCardEstablishContext作为服务挂起

我有很多Windows安装正常工作的代码。它访问Cherry键盘的智能卡读卡器(6x44)以读取智能卡上的数据。它在大多数试用过的电脑上都能正常工作。但是,在一些使用西班牙语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 
+0

它与“允许服务与桌面交互”设置有关吗? – 2009-04-14 16:04:27

+0

好的想法,但没有,已经尝试过,并没有影响任何东西。 – mj2008 2009-04-15 15:19:33

回答

2

可能有不同的原因,该API函数似乎挂起,像死锁,或者一个看不见的消息框或对话框等待用户输入。你应该尝试获得堆栈跟踪using WinDbg

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