Delphi程序执行程序超过512个字符

时间:2012-03-13 16:56:25

标签: delphi shellexecute pdftk

我需要从Delphi 2006代码中调用一个带有一长串参数的外部程序,特别是使用PDFTK将多个PDF连接成一个文件。要执行的完整字符串超过512个字符,但WinExec和ShellExecute都有512个字符的限制。

这些程序的替代方案是否有更大的限制?

3 个答案:

答案 0 :(得分:4)

只需使用临时BATCH文件,其中包含要执行的命令。

这也将允许一些增强功能,例如连续调用多个PDFTK实例,添加文件的备份或副本,只是在同一个过程中。

将批处理作为SW_SHOWMINIMIZED运行,以便不会弹出黑色控制台窗口。

答案 1 :(得分:3)

传递给ShellExecute的名称长度有limits,但这些名称通常大于512个字符。看起来你只需要动态分配名称而不是使用静态字符数组。

如果要转到最终命令行长度,则可以使用CreateProcess,其中限制为32,768个字符。

作为另一种选择,您可以考虑将参数列表写入临时文件。然后,您将修改外部程序,以便它能够作为其命令行参数传递到该文件的路径。您显然还需要修改外部程序,以便它可以读取文件并从临时文件中获取长文件列表。

答案 2 :(得分:3)

刚刚找到这个@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;