Почему моя команда не запускается так, как я ожидал, когда я использую ShellExecute? - PullRequest
0 голосов
/ 08 января 2011

Я пытаюсь вывести PDF в текст, используя утилиту командной строки (работает с тестами из командной строки dos) из моего кода Delphi.

Вот мой код

if fileexists(ExtractFilePath(Application.ExeName) + 'pdftotext.exe') then
begin
  ShellExecute(H,'open', 'pdftotext.exe', PWideChar(fFileName), nil, SW_SHOWNORMAL);
  if fileExists(changeFileExt(fFileName, '.txt')) then
    Lines.LoadFromFile(changeFileExt(fFileName, '.txt'))
  else
    ShowMessage('File Not found');
end;

При размещении точек останова в коде и переходе через него, он достигает значения

if fileExists(changeFileExt(fFileName, '.txt')) then  

строка, но возвращает false, поэтому вызывается Shellexecute, но ни один файл не был выгружен

Что я сделал не так?

Ответы [ 2 ]

7 голосов
/ 08 января 2011

ShellExecute не ожидает завершения работы вызванной программы.Вы, вероятно, проверяете файл слишком рано.Файл просто еще не создан.

Запустите программу и дождитесь ее завершения, прежде чем проверять выходной файл.ShellExecute не возвращает достаточно информации, чтобы вы могли это сделать, поэтому вам следует попробовать CreateProcess.Есть несколько примеров того, как это сделать.Попробуйте это:

Как мне дождаться завершения программы из командной строки?

1 голос
/ 10 января 2011

Оказывается, что добавление пути заполнения к исполняемому файлу сделало его просто отлично

uses
  Forms, ShellAPI, SysConst, SysUtils;

procedure Pdf2Text(const fFileName: string; const Lines: TStrings);
var
  H: HWND;
  PdfToTextPathName: string;
  ReturnValue: Integer;
  TxtFileName: string;
begin
  H := 0;
  PdfToTextPathName := ExtractFilePath(Application.ExeName) + 'pdftotext.exe'; // full path
  if FileExists(PdfToTextPathName) then
  begin
    ReturnValue := ShellExecute(0,'open', PWideChar(PdfToTextPathName), PWideChar(fFileName), nil, SW_SHOWNORMAL);
    if ReturnValue <= 32 then
      RaiseLastOsError();
    // note: the code below this line will crash when pdftotext.exe does not finish soon enough; you should actually wait for pdftotext.exe completion
    TxtFileName := ChangeFileExt(fFileName, '.txt');
    if FileExists(TxtFileName) then
      Lines.LoadFromFile(TxtFileName)
    else
      raise EFileNotFoundException.CreateRes(@SFileNotFound);
  end;
end;

Редактировать: Некоторая очистка кода помогает своевременно обнаруживать ошибки, особенно при тестировании концепции.

...