Externes Programm starten und auf Beenden warten, bzw reagieren, wenn es nicht gefunden wurde - wie?
-
Hallo!
Ich starte ein externes Programm, was mir eine Datei anlegt, die ich dann auswerte.
Momentan starte ich das so:::WinExec(_T("Kim.exe"), SW_MINIMIZE);
Ich muss aber warten, bis das fertig ist und darf vorher nicht weitermachen.
Wie kann ich warten?
Und wie merke ich, dass es nicht gefunden wurde?Danke!
PS: Kennt wer das Programm, was ich da starte und hat ne Doku (und/oder ne neue Version) dazu? Ich hab hier nur nen Kollegen, der aber auch nicht allzuviel weiß.
-
ähm wie jetzt?
ist doch prozedual, ne?
... ... exe aufführen // erst wenn beendet geht's weiter? ...
das würde ja auch so sinn machen. musst wahrscheinlich eigenen thread starten, in diesem rufst du die exe auf, dann kannst auf beiden programmen arbeiten.
habe ich nicht gemacht, würde es so probieren
-
du kannst ja den thread dann schliessen ( wenn fertig ) und da auswerten ob ausgeführt oder nicht. dann kannste den thread schliessen und in deinem programm weitermachen.
wenn programm mit 0 beendet wurde, hats geklappt
-
hm da gibt es mehrere Varianten:
Ich würde ne Named Pipe machen in die beide deiner Progs reinschreiben und dann kannst du in deinem ersten Prog sowas hier machen:BOOL WaitNamedPipe( LPCTSTR lpNamedPipeName, // pointer to name of pipe for which to wait DWORD nTimeOut // time-out interval, in milliseconds );
oder du kannst auch
Process.waitFor machen sollte glaube ich auch funktionieren.
-
Ähhh, von der Kim.Exe hab ich keinen Code. (Sonst würd ich doch nicht so doof nach ner Doku fragen.
)
@newkid: WinExec kehrt sofort zurück, dazu suche ich ne Alternative. Da isses doch egal, ob ich das im Thread starte oder nicht.
-
hmm super notfallprogramm rausholen
timer der schaut ob die kim.exe läuft, solange dein programm pausen
wenn nicht mehr läuft, dann bwait variable auf false setzen ( damit es weitergeht ) und den timer schliessen
-
bzw reagieren, wenn es nicht gefunden wurde
hmm hier die rückgabemöglichkeiten
0 The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND The specified file was not found.
ERROR_PATH_NOT_FOUND The specified path was not found.
ERROR_BAD_FORMAT The .exe file is invalid (non-Win32.exe or error in .exe image).
SE_ERR_ACCESSDENIED The operating system denied access to the specified file.
SE_ERR_ASSOCINCOMPLETE The file name association is incomplete or invalid.
SE_ERR_DDEBUSY The DDE transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL The DDE transaction failed.
SE_ERR_DDETIMEOUT The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND The specified dynamic-link library was not found.
SE_ERR_FNF The specified file was not found.
SE_ERR_NOASSOC There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.
SE_ERR_OOM There was not enough memory to complete the operation.
SE_ERR_PNF The specified path was not found.
SE_ERR_SHARE A sharing violation occurred.du brauchst dann --> SE_ERR_FNF
-
Hallo!
Das ist ein Ausschnitt aus meinem Programm. Ich hoffe, du kannst damit was anfangen:
PROCESS_INFORMATION pi = {0}; STARTUPINFO si = {sizeof(si)}; si.wShowWindow = SW_NORMAL; CreateProcess("Programm.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForSingleObject( pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
Gruß
-
Danke, der Code ist super!
Jetzt muss ich mal gucken, ob ich mit den da bekannten Sachen auch das Programm "abschießen" kann.
Mir hängt sich das Teil dauernd auf und ist nur über den Taskmanager loszuwerden.
Und sowas kann man den Endanwendern nicht geben.