【问题标题】:Delphi procedure execute program with more than 512 charsDelphi 程序执行超过 512 个字符的程序
【发布时间】:2012-03-13 16:56:24
【问题描述】:

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

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

【问题讨论】:

  • 您不能在迭代中连接 PDF 吗? IE。 a+b,然后是结果+c,等等?
  • @Lasse - 是的,我考虑过这一点,但我不想打多个电话,以防它太慢。不过,我以后可能不得不依靠这个想法!
  • @RRUZ - 我见过的所有 WinExec 实现似乎都是用 'zAppName: array[0..512] of char;' 设置的ShellExecute 似乎有几种不同的调用方式,所以我现在只是进一步研究一下
  • 根据您的上一条评论,您似乎找到了使用固定大小缓冲区调用 WinExec 的代码,因此您假设 WinExec 本身就有这样的限制,ShellExecute 也是如此。那么,您是在询问您实际遇到的问题,还是只是猜测问题存在并询问在可能根本没有什么可解决的情况下如何抢先解决它?

标签: delphi shellexecute pdftk


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 - 我确信这会起作用,但我刚刚发现了一些比我正在查看的更现代的 ShellExecute 代码。它似乎工作得很好。
  • ... 直到达到 2049 个字节。然后它就坏了。
【解决方案2】:

刚刚发现了这个@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】:

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

    如果你想达到终极命令行长度,那么你可以使用CreateProcess,它有 32,768 个字符的限制。

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

    【讨论】:

    • 谢谢 - 我确信这会起作用,但我刚刚发现了一些比我正在查看的更现代的 ShellExecute 代码。它似乎工作得很好。
    • 显然您只能在 .CMD 文件中每行达到 8K。我知道我总是打那个。 (有人记得 VAX VMS 命令行吗?就像有人对 Unix 短命令名和 EVERYTHING_WAS_A_BIG_LONG_THING_LIKE_THIS 有过敏反应。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多