Delphi 2006コードの外部プログラムを引数の長いリストで呼び出す必要があります。特に、複数のPDFをPDFTKを使用して1つのファイルに連結する必要があります。実行される完全な文字列は512文字を超えますが、WinExecとShellExecuteの両方に512文字の制限があります。Delphiのプロシージャは512文字以上のプログラムを実行します
これらの手順には、はるかに大きな制限がありますか?
Delphi 2006コードの外部プログラムを引数の長いリストで呼び出す必要があります。特に、複数のPDFをPDFTKを使用して1つのファイルに連結する必要があります。実行される完全な文字列は512文字を超えますが、WinExecとShellExecuteの両方に512文字の制限があります。Delphiのプロシージャは512文字以上のプログラムを実行します
これらの手順には、はるかに大きな制限がありますか?
ちょうどうまく動作するように思われる、この@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;
ShellExecute
に渡される名前の長さにはlimitsがいくつかありますが、これらは通常512文字を超えます。静的なchar配列を使用するのではなく、名前を動的に割り当てる必要があるようです。
最終的なコマンドラインの長さに移動する場合は、CreateProcess
を使用できますが、制限は32,768文字です。
別のオプションとして、引数リストを一時ファイルに書き込むこともできます。次に、外部プログラムを変更して、コマンドライン引数としてそのファイルへのパスを渡すことができるようにします。外部プログラムを変更して、ファイルを読み取り、テンポラリファイルからファイルの長いリストを取得できるようにする必要があります。
ありがとう - 私はそれがうまくいくと確信していますが、私はちょうど私が見ていたものよりも少し現代的なShellExecuteコードを見つけました。それはうまく動作するようです。 – JamesW
明らかに.CMDファイルの1行につき8Kにしか行くことができません。私はいつもそれを打つことを知っている。 (誰でもVAX VMSのコマンドラインを覚えていますか?それは誰かがUnixの短いコマンド名にアレルギー反応を起こしたようなものでした) –
実行するコマンドを含む一時BATCHファイルを使用してください。
これにより、複数のPDFTKインスタンスを連続して呼び出したり、同じプロセス内でファイルのバックアップやコピーを追加するなど、いくつかの拡張された機能も使用できます。
バッチをSW_SHOWMINIMIZEDとして実行すると、黒色のコンソールウィンドウがポップアップしないようになります。
ありがとう - 私はうまくいくでしょうが、ちょっと現代的なShellExecuteコード私が見ていたものよりも。それはうまく動作するようです。 – JamesW
... 2049バイトまでヒットします。その後、それは壊れます。 –
あなたは反復でPDF年代を連結することができませんでしたか?すなわち、 a + b、結果+ cなど? –
@Lasse - そうだと思っていましたが、あまりにも遅くなる場合に備えて複数のコールを希望したくありません。私は後でその考えに後退しなければならないかもしれません! – JamesW
@RRUZ - 私が見たWinExecのすべての実装は、 'zAppName:array [0..512] of char;'で設定されているようです。しかし、ShellExecuteにはいくつかの異なるスタイルの呼び出しがあるようですので、ちょっと詳しく調べてみましょう。 – JamesW