ShellExecute
-
Wie kann ich mein Programm dazu bringen nach dem fogenden Aufruf zu warten, bis der Prozess abgeschlossen ist?
ShellExecute(m_hWnd, "open", "curl.exe", importbefehl, NULL, SW_HIDE);
-
meinst du sowas?
STARTUPINFO siStartupInfo; PROCESS_INFORMATION piProcessInfo; memset(&siStartupInfo, 0, sizeof(siStartupInfo)); memset(&piProcessInfo, 0, sizeof(piProcessInfo)); siStartupInfo.cb = sizeof(siStartupInfo); if(CreateProcess("c:\\Windows\\system32\\notepad.exe", " example.txt", 0, 0, FALSE, CREATE_DEFAULT_ERROR_MODE, 0, 0, &siStartupInfo, &piProcessInfo)){ WaitForSingleObject(piProcessInfo.hProcess, INFINITE); CreateProcess("c:\\Windows\\system32\\calc.exe", " example.txt", 0, 0, FALSE, CREATE_DEFAULT_ERROR_MODE, 0, 0, &siStartupInfo, &piProcessInfo); ::CloseHandle(piProcessInfo.hThread); ::CloseHandle(piProcessInfo.hProcess); }
-
Ja, so etwas habe ich zuvor ausprobiert. Mit CreateProcess hatte ich aber das Probelm, dass mit dem Prozess ein Fenster im Vordergrund geöffnet wurde, obwohl ich
si.wShowWindow = SW_HIDE;
gesetzt habe. Deshalb habe ich das ganze mit shellexecute ausbrobiert. Wie könnte ich in Deinem Beispiel verhindern, dass ein Dosfenster geöffnet wird? Schon mal vielen Dank für Deine Hilfe!!
-
Moin!
Tip:
Wenn du WaitForSingleObject() benutzen willst solltest du das aber besser in einem eigenen Thread machen, denn sonst hängt das Programm fest und Windows beginnt zu meckern mit "Anwendung reagiert nicht" usw wenn das Programm länger als 10 Sekunden zur Ausführung brauchen sollte...Nächstes Thema:
CreateProcess() ist eindeutig die bessere Wahl für diesen Zweck. Warum das Fenster trotzdem angezeigt werden soll kann ich nicht ganz nachvollziehen. Sollte eigentlich nicht passieren. Da ich Leuten grundsätzlich alles zutraue: hast du eventuell das SW_HIDE vor dem memset gesetzt? ;PHier noch ein Schnipsel aus dem MSDN der vielleicht helfen könnte:
MSDN schrieb:
CreateProcess
[...CUT...]
dwCreationFlags
[IN] Specifies additional flags that control the priority class and the creation of the process. The following creation flags can be specified in any combination, except as noted.[...CUT...]
CREATE_NO_WINDOW
Windows NT/2000/XP: This flag is valid only when starting a console application. If set, the console application is run without a console window.
This flag cannot be used with MS-DOS-based applications.[...CUT...]
Gruß
PS: Eine andere etwas unprofessionellere Variante wärs per CreateToolhelp32Snapshot() die Process-Tables abzufragen um zu prüfen ob der noch da is
aber der Effekt ist der selbe wie bei WaitForSingleObject... allerdings könntest du dann 100 Prozesse gleichzeitig starten und dann abwarten bis alle wieder weg sind ohne 100 Threads mit WaitForSingleObject() zu erzeugen, alle 100 hinter einander aufzurufen oder mit WaitForMultipleObjects() zu arbeiten, denn mir gefällt der Gedanke mit dem hängenden Programm nicht so sehr
... Aber das mit dem Process-Tables kommt gut wenn man viele idle-Prozesse hat die im Hintergund werkeln fürn paar Stunden, kann man dann in beliebigen intervallen Prüfen lassen... ist find ich für nen ordentlichen Programmablauf einfacher zu handhaben als irgendwelche endlosschleifen in Threads 