2012-03-13 3 views
1

Мне нужно вызвать внешнюю программу из кода Delphi 2006 с длинным списком аргументов, в частности для объединения нескольких файлов PDF в один файл с помощью PDFTK. Полная строка, которая должна быть выполнена, имеет более 512 символов, но оба WinExec и ShellExecute имеют ограничение на 512 символов.Программа выполнения Delphi с более чем 512 символами

Есть ли альтернативы этим процедурам, которые имеют гораздо большие ограничения?

+0

вы не могли бы объединить в PDF-х в итераций? то есть. a + b, то результат + c и т. д.? –

+0

@ Lasse - Да, я подумал об этом, но я не хочу иметь несколько вызовов, если он слишком сильно замедляет его. Возможно, мне придется вернуться к этой идее позже! – JamesW

+0

@RRUZ - Все реализации WinExec, которые я видел, похоже, настроены с помощью 'zAppName: array [0..512] of char;' ShellExecute, похоже, имеет несколько разных стилей вызова, поэтому я просто изучаю это немного позже. – JamesW

ответ

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; 
3

Есть длина limits по длине имен, переданных в ShellExecute, но они обычно больше 512 символов. Кажется, вам просто нужно динамически распределять имена, а не использовать статический массив char.

Если вы хотите перейти на конечную длину командной строки, вы можете использовать CreateProcess который имеет ограничение 32 768 символов.

В качестве другого варианта вы можете рассмотреть возможность записи списка аргументов во временный файл. Затем вы должны изменить внешнюю программу, чтобы она могла передавать путь к этому файлу в качестве аргумента командной строки. Вам, очевидно, потребуется также изменить внешнюю программу, чтобы она могла читать файл и получать длинный список файлов из временного файла.

+0

Спасибо - я уверен, что это сработает, но я только что нашел немного более современный код ShellExecute, чем тот, на который я смотрел. Кажется, он работает хорошо. – JamesW

+0

Очевидно, вы можете перейти только к 8K за одну строку в файле .CMD. Я знаю, что я всегда нахожу это. (Кто-нибудь помнит командные строки VAX VMS? Было похоже, что у кого-то была аллергическая реакция на короткие имена команд Unix и EVERYTHING_WAS_A_BIG_LONG_THING_LIKE_THIS.) –

4

Просто используйте временный файл BATCH, содержащий команды для выполнения.

Это позволит также некоторые расширенные функции, такие как вызов нескольких экземпляров PDFTK в ряд, добавление резервной копии или копирование файлов только в том же процессе.

Запустите пакет в качестве SW_SHOWMINIMIZED, чтобы не было черного окна консоли.

+0

Спасибо - я уверен, что это сработает, но я только что нашел немного более современный код ShellExecute чем тот, на который я смотрел. Кажется, он работает хорошо. – JamesW

+0

... Пока вы не нажмете 2049 байт. Затем он ломается. –

 Смежные вопросы

  • Нет связанных вопросов^_^