Search code examples
delphiwinapicommand-linedelphi-2010shellexecute

Why doesn't my command run like I expected when I use ShellExecute?


I am trying to dump a PDF to text using a command line utility (It works with tests from dos command line) from my Delphi code.

Here is my code

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;

When placing breakpoints in code and stepping through, it makes it to the

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

line but returns false, so the Shellexecute was called but no file was ever dumped

What have I done wrong?


Solution

  • It turns out, that adding the fill path to the execuatble made it work just fine

    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;
    

    Edit: Some code cleanup helps big time to catch errors early on, especially when testing a proof of concept.