CreateProcess()
-
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.