Процедура Delphi выполняет программу с более чем 512 символами - PullRequest
1 голос
/ 13 марта 2012

Мне нужно вызвать внешнюю программу из кода Delphi 2006 с длинным списком аргументов, в частности, для объединения нескольких PDF-файлов в один файл с использованием PDFTK.Полная строка, которая должна быть выполнена, имеет более 512 символов, но и WinExec, и ShellExecute имеют ограничение в 512 символов.

Есть ли альтернативы этим процедурам, которые имеют гораздо большие ограничения?

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Просто используйте временный файл BATCH, содержащий команды, которые должны быть выполнены.

Это позволит также некоторые расширенные функции, такие как вызов нескольких экземпляров PDFTK подряд, добавление резервной копии или копии файлов, просто втот же процесс.

Запустите пакет как SW_SHOWMINIMIZED, чтобы не всплыло черное окно консоли.

3 голосов
/ 13 марта 2012

Только что нашел этот @SwissDelphiCentre, который, кажется, хорошо работает:

procedure ShellExecute_AndWait(FileName: string; Params: string);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    ExInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
end;
3 голосов
/ 13 марта 2012

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

Если вы хотите перейти к максимальной длине командной строки, вы можете использовать CreateProcess, который имеет ограничение в 32 768 символов.

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

...