我需要从 Delphi 2006 代码中调用一个带有一长串参数的外部程序,特别是使用 PDFTK 将多个 PDF 连接到一个文件中。要执行的完整字符串超过 512 个字符,但 WinExec 和 ShellExecute 都有 512 个字符的限制。
这些程序有没有更大限制的替代方案?
我需要从 Delphi 2006 代码中调用一个带有一长串参数的外部程序,特别是使用 PDFTK 将多个 PDF 连接到一个文件中。要执行的完整字符串超过 512 个字符,但 WinExec 和 ShellExecute 都有 512 个字符的限制。
这些程序有没有更大限制的替代方案?
只需使用一个临时 BATCH 文件,其中包含要执行的命令。
这也将允许一些增强的功能,例如连续调用多个 PDFTK 实例,添加文件的备份或副本,只是在同一个过程中。
以 SW_SHOWMINIMIZED 运行批处理,以不弹出黑色控制台窗口。
传递给 的名称长度有一些限制ShellExecute
,但通常大于 512 个字符。看来您只需要动态分配名称而不是使用静态 char 数组。
如果您想达到最终的命令行长度,则可以使用CreateProcess
限制为 32,768 个字符的命令行。
作为另一种选择,您可以考虑将参数列表写入临时文件。然后,您将修改外部程序,使其能够将该文件的路径作为其命令行参数传递。您显然还需要修改外部程序,以便它可以读取文件并从临时文件中获取文件的长列表。
刚刚找到了这个@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;