CreateProcess()
-
1. ja, ich hab mir im forum alle passenden themen durchgelesen.
2. ja, ich habe gegoogelt.
3. ja, ich bin genervt.problem:
eigentlich nix dickes. ich will einen batch mittels createprocess() starten. warum createprocess()? ich will den std und den err out in 2 files umleiten. deswegen kommen wir da nich drumrum.
das ganze soll als native methode inner halb einer jvm laufen. von daher benutz ich die wide version der methode.
laut msdn sollte dieser code hier funktionieren:
LPCWSTR app = L"C:\\WINNT\\system32\\cmd.exe"; LPWSTR cmd = L"/c scripts\\1.bat"; LPCWSTR dir = L"app"; STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; PROCESS_INFORMATION pi; LPSTARTUPINFOW si_w = (LPSTARTUPINFOW) &si; bool success = CreateProcessW(app, cmd, 0, 0, TRUE, CREATE_NEW_CONSOLE, NULL, dir, si_w, &pi);das ganze kompiliert vernünftigt. startet auch gut. es wird auch ein prozess erzeugt allerdings führt der nicht meinen batch aus.
wenn ich
LPWSTR cmd = L"/c scripts\\1.bat";in
LPWSTR cmd = L"/c pause";änder, dann sollte der prozess gestartet werden und die shell den pause befehl durchführen. quasi sollte die shell auf ne eingabe warten und sich dann wieder beenden. tut sie aber nicht. genau wie oben wird hier einfach einen konsole geöffnet und sofort wieder geschlossen. es erscheint mir als wenn er meinen parameter 'cmd' einfach ignoriert.
jemand ne idee?
-
Gib mal den vollständigen Pfad zur Batchdatei an. Der gestartete Prozess übernimmt AFAIK nicht dein aktuelles Arbeitsverzeichnis.
-
Warte doch mit WaitForSingleObject auf die Process Termnierung (Handle ist in PROCESS_INFORMATION enthalten).
Simon
-
bringt nix. hat sonst jemand ne erklärung dafür, dass er das mit 'pause' nicht mal frisst?
-
Lass den ersten Parameter LEER (NULL) und übergib alles im zweiten!
Das Problem ist, dass die _meisten_ Programme davon ausgehen, dass der erste (0.) Kommandozeilen-Parameter der Name der EXE selber ist. In Deinem Fall ist es aber schon der "richtige" Parameter, und somit kommt das Programm nicht ganz zurecht damit...
-
Und zum 2. Parameter von CreateProcess:
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
-
so siehts nu aus:
WCHAR cmd[] = L"C:\\WINNT\\system32\\cmd.exe /c pause"; LPCWSTR dir = L"app"; STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; PROCESS_INFORMATION pi; LPSTARTUPINFOW si_w = (LPSTARTUPINFOW) &si; bool success = CreateProcessW(NULL, cmd, 0, 0, TRUE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULL, dir, si_w, &pi);das mit 2. parameter sollte ja nu auch stimmen oder seh ich das falsch?
allerdings is das resultat das gleiche wie vorher auch. die konsole popt auf und geht gleich wieder zu.
-
bliblablubb schrieb:
die konsole popt auf und geht gleich wieder zu.
Schon mal daran gedacht, einfach mal auf einen Tastendruck des Users zu warten, bevor das Programm beendet wird?
z.B. mit getch()Martin
-
bliblablubb schrieb:
das mit 2. parameter sollte ja nu auch stimmen oder seh ich das falsch?
Du siehst es falsch.
Verwende wcsdup um einen schreibbaren Zeiger zu bekommen! Per default legt der Compiler alle String-Literals in einen Read-Only Bereich, auch wenn Du kein "const" angibst.
-
Falsch, er hat es jetzt richtig! Er hat nämlich jetzt ein char-Array benutzt!
-
Ja, sorry... hatte ich übersehen...
-
ich hab mir zu debug zwecken ne kleine exe geschrieben, die mir den übergebenen argv[] dumpt. letzte zeile in dem code ist ein getchar(). wenn ich die CreateProcessW() nun mit dieser exe aufruf, egal ob als lpApplicationName oder als erster teil von lpCommandLine oder auch beides, es ist immer das gleiche resultat: der prozess startet in einer konsole und wird sofort wieder geschlossen. pfade sind alle richtig. wenn ich nen falschen eingeb gibt mir der vaterprozess bei GetLastError() 2 zurück (FILE NOT FOUND). das tut er beim korreketen jedoch nicht. dennoch wie gesagt, keine ausgabe, unabhängig von lpCommandLine und halt die sofortige wiederschließung der konsole. jemand noch ne idee?
-
WCHAR cmd[] = L"cmd.exe /c pause"; STARTUPINFOW si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION pi; bool success = CreateProcessW(NULL, cmd, 0, 0, TRUE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi);si.dwFlags = STARTF_USESTDHANDLES;bringt wohl irgendwie den entscheidenden unterschied.