特にPDFTKを使用して複数のPDFを1つのファイルに連結するには、引数の長いリストを使用してDelphi2006コードから外部プログラムを呼び出す必要があります。実行される完全な文字列は512文字を超えますが、WinExecとShellExecuteの両方に512文字の制限があります。
はるかに大きな制限があるこれらの手順に代わるものはありますか?
特にPDFTKを使用して複数のPDFを1つのファイルに連結するには、引数の長いリストを使用してDelphi2006コードから外部プログラムを呼び出す必要があります。実行される完全な文字列は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;