Зачем нужен 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
Связано ли это с настройкой «разрешить обслуживание для взаимодействия с рабочим столом»? –
Хорошая мысль, но нет, это было проверено и ничего не сказалось. – mj2008