2009-04-14 114 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

您還應該確保您嘗試在相同的環境中重現該錯誤。重要的一點可能是快速用戶切換是否處於活動狀態以及其他用戶是否已登錄,同時還有相同的設備驅動程序和服務正在運行。