ograniczenie długości parametrów wywołania CreateProcess

0

wygląda mi na to że mój program wysypuje się przy wywołaniu:

var
ExeCmdLine, ExeName: Widestring;
  PI: TProcessInformation;
  SI: TStartupInfo;

CreateProcessW(PWideChar(ExeName), PWideChar(ExeCmdLine), nil, nil, False,
       0, nil, nil, SI, PI)

gdy ExeCmdLine jest odpowiednio długie. nie spradzałem jeszcze jak długie, najpierw się chciałem zapytać czy takie wyjaśnienie ma sens. a wysypanie ma taką postać że albo explorer się resetuje od tak, albo po chwilowym muleniu uruchamia się windosowe zapobieganie wykonywania danych, a następnie wysyp explorera przez drwatson czy jak tam on się nazywa ten program...
...więc jak, wypada mi dzielić linie parametrów czy raczej szukać przyczyny gdzie indziej ?

0

Jak na moje oko to pole dwCreationFlag nie powinno zostać ustawione na 0, popraw mnie jeżeli sie myle. W helpie jest napisane że lepiej jest <ort>uŻyć </ort>nazwy pliku wykonywalnego jako pierwszy parametr w lpCommandline a lpApplicationName ustawić na nill;

0

z tego co widzę po przykładach z sieci to 0 jest na porządku dziennym. ExeName zawiera exec'a owszem, ale ExeCmdLine też ('a.exe' i 'a.exe -params'). myślę że gdyby była źle któraś z rzeczy które wymieniłeś, to proces miałby zawsze problemy z uruchomieniem. aha, jak piszę o długiej liście parametrów to mam na myśli naprawdę długą, jak bezwględne ścieżki do 200 plików na przykład.

[edit]
to chyba jednak będzie to, ograniczenie długości...

0

W helpie do CreateProcess microsoft nie wspomina nic o ograniczeniach apropos długości plCommandLines.
No ale jeśli się tak dzieje, to nie jesteś tego w stanie zmienić. Jeżeli jest możliwość to sugeruje zmienić sposób przetazywania parametrów przez plik, przez DDE(?) albo coś jescze bardziej zmyślnego.

0

ha ! wróg przybył z innego unitu !

byłem zdziwiony jak po przesłaniu tejże problemowej lini poleceń poprzez plik pośredni błąd nie zniknął, ale zdziwiłem się jeszcze bardziej jak okazało się że wszystkiemu winna funkcja WideFormat z sysutils. cóż, uważajcie na nią...(D6 ent)

SPackInfoApp = '%slalala.exe';
procedure ExecuteAppW(var FileNames : widestring; ParentWnd: HWND);
var
ExeCmdLine, ExeName: Widestring;
SCmdLine : widestring;
begin
SCmdLine := '"%s" %s';
GetModuleFileName(HInstance, Buffer, SizeOf(Buffer));
ExeName := Format(UTF8Decode(SPackInfoApp), [WideExtractFilePath(Buffer)]);


ExeCmdLine := WideFormat(SCmdLine, [ExeName, FileNames]);


//zamiast tego ostatniego wystarczyło:

SCmdLine:=UTF8Decode( AnsiReplaceText(UTF8Encode(SCmdLine),'"%s"','"'+UTF8Encode(ExeName)+'"'));
SCmdLine:=UTF8Decode(AnsiReplaceText(UTF8Encode(SCmdLine),'%s',UTF8Encode(FileNames)));
ExeCmdLine:=SCmdLine;

1 użytkowników online, w tym zalogowanych: 0, gości: 1