1

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

はるかに大きな制限があるこれらの手順に代わるものはありますか?

4

3 に答える 3

4

実行するコマンドを含む一時的なBATCHファイルを使用するだけです。

これにより、同じプロセスで、複数のPDFTKインスタンスを連続して呼び出したり、ファイルのバックアップやコピーを追加したりするなど、いくつかの拡張機能も使用できるようになります。

SW_SHOWMINIMIZEDとしてバッチを実行し、黒いコンソールウィンドウがポップアップしないようにします。

于 2012-03-13T17:12:24.717 に答える
3

に渡される名前の長さにはいくつかの制限ShellExecuteがありますが、これらは通常512文字を超えます。静的なchar配列を使用するのではなく、名前を動的に割り当てる必要があるようです。

究極のコマンドライン長に行きたい場合はCreateProcess、32,768文字の制限があるものを使用できます。

別のオプションとして、引数のリストを一時ファイルに書き込むことを検討できます。次に、外部プログラムを変更して、コマンドライン引数としてそのファイルへのパスを渡すことができるようにします。明らかに、外部プログラムも変更して、ファイルを読み取り、一時ファイルからファイルの長いリストを取得できるようにする必要があります。

于 2012-03-13T17:00:45.257 に答える
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;
于 2012-03-13T17:16:42.877 に答える