2009-04-14 37 views
2

サービスから呼び出されたときにSCardEstablishContextがハングし、返されないのはなぜですか?SCardEstablishContextがサービスとしてハングする

多くのWindowsインストールでうまく動作するコードがあります。それは、チェリーキーボードのスマートカードリーダー(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 
+0

「サービスとデスクトップとの対話を許可する」設定に関係していますか? –

+0

いい考えですが、それは試されていて影響を与えませんでした。 – mj2008

答えて

2

は、API関数は、デッドロックのように、ハングしているように見える、または目に見えないメッセージボックスやダイアログは、ユーザーの入力を待って、なぜ別の理由があるかもしれません。あなたはスタックトレースusing WinDbgを取得しようとする必要があります。

また、同じ環境でバグを再現しようとしていることを確認する必要があります。重要な点は、簡易ユーザー切り替えがアクティブであるかどうか、および他のユーザーがログオンしているかどうか、同じデバイスドライバーとサービスが実行中であるかどうかなどです。

+0

私はWinDbgオプションを試してみます - スタックトレースは良い手がかりになります。高速なユーザー切り替えが有効になっていない私は思っていません。確かに1人のユーザーしかアクティブではありません。私は昨日再起動し、自動的に起動するので、ユーザーが起動する前にハングアップしていました。 – mj2008

+0

WinDbgは、実際の答えではないにしても、解決策を見つけるために働いていました。私はXP SP3に更新したが、WinDbgはおそらく古いかもしれないappディレクトリからwinscard.dllをロードしていることを示した。私は、DLLを削除し、それを実行し、すべて正常に再び働いた。ありがとう! – mj2008

関連する問題