2009-04-14 1 views
2

Зачем нужен SCardEstablishContext зависать, никогда не возвращаться при вызове из службы?SCardEstablishContext зависает как услуга

У меня есть код, который отлично работает на многих установках Windows. Он получает доступ к считывателю смарт-карт Cherry (6х44) для чтения данных на смарт-карте. Он отлично работает на большинстве ПК, на которые он был опробован. Однако на некоторых компьютерах, работающих в Испании с испанскими Windows, функция 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 зависла, как тупик, или поле невидимого сообщения или диалога, ожидая ввода данных пользователем. Вы должны попытаться получить stacktrace using WinDbg.

Вы также должны убедиться, что пытаетесь воспроизвести ошибку в той же среде. Важные моменты могут заключаться в том, активна ли быстрое переключение пользователей и какие другие пользователи вошли в систему, а также о том, что существуют одни и те же драйверы устройств и службы.

+0

Я попробую вариант WinDbg - трассировка стека будет хорошей подсказкой. Быстрая коммутация пользователей не включена. Я не думаю, и, конечно, есть только один пользователь. Я перезагрузился вчера, и он запускается автоматически, поэтому он был виден до того, как любой пользователь может начать. – mj2008

+0

WinDbg работал для поиска решения, если не реального ответа. Я обновился до XP SP3, но WinDbg показал, что он загружал winscard.dll из каталога приложений, который, вероятно, был старым. Я удалил DLL, и запустил его, и все снова работало нормально. Благодаря! – mj2008