Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > GPG CreateProcess из сервиса


Автор: Nimua 23.11.2007, 15:11
Здравствуйте,

не уверена что раздел верный...

Есть проблема: есть сервис (служба), в ней иногда вызывается шифрование - вызываю GPG.exe (GnuPG) с помощью CreateProcess

Код

var
    CommandLine: string;
    StartupInfoParam: StartupInfo;
    ProcessInf: PROCESS_INFORMATION;
    ResCode: cardinal;
    EncryptFile: TFileStream;
    text : string;
    IdText: TIdText;
    GPGPath: string;
..............

CommandLine:=GPGPath+'gpg.exe --homedir '+GPGPath+' -z 0 --yes --always-trust '+
                   ' -t -a -e -r ' + KeyPGPName +
                   ' -o '+ Path+FileNamePGP+' '+Path+FileName;
      GetStartUPInfo(StartUpInfoParam);
      StartUpInfoParam.wShowWindow := SW_HIDE;
      if CreateProcess(PAnsiChar(GPGPath+'gpg.exe'),PAnsiChar(CommandLine),nil,nil,false,0,nil,
                    PAnsiChar(ExtractFileDir(Path)),
                    StartUpInfoParam,ProcessInf)
      begin
           WaitForSingleObject(ProcessInf.hProcess,infinite);
           GetExitCodeProcess(ProcessInf.hProcess,ResCode);
           if ResCode=0 then
            .........
      end;


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

GPG encryption failed. Code: 128 Error: 0

И все. после этого оно на этом застревает, то есть сервис пытается снова обработать файл, и снова ошибка шифрования. и так пока не перезапущу сервис..  smile 


Автор: Snowy 23.11.2007, 16:34
Ну что тут посоветовать.
Проблема сервиса. В нём бага.
Могу посоветовать только программно перезапустить сервис при ошибке...

Автор: Nimua 23.11.2007, 18:22
так сервис то мой : )) 
в смысле TService
как понять в чем именно глюк? 
При чем я не понимаю gpg внешний процесс, как он понимает что его инициирует тот же сервис, в смысле что может меняться при перезапуске сервиса такого что это влияет на CreateProcess??


Автор: Rennigth 23.11.2007, 18:46
Nimua, может происходит так что сервис не закончив рабуту с 
этим процессом пытается запустить его еще раз? А он в свою очередь использет какие-нибудь общие ресурсы... попробуй банально в критическу секцию запихнуть код создания процесса gpg.exe

Автор: Nimua 23.11.2007, 20:35
To Rennigth: спасибо, если не поможет, то что сделала попробую.

Прочитала в хелпе (если ничего не помогает прочтите наконец инструкцию), что после завершение CreateProcess обязательно надо делать CloseHandle для хэндлов в PROCESS_INFORMATION. Вставила после получения рес кода

Код

begin
           WaitForSingleObject(ProcessInf.hProcess,infinite);
           GetExitCodeProcess(ProcessInf.hProcess,ResCode);
           CloseHandle(ProcessInf.hProcess);
           CloseHandle(ProcessInf.hThread);


посмотрю, что будет. думаю косяк был в этом.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)