EXE aufrufen - modal ?
-
Hallo
Ist es irgendwie möglich ein Programm so von einem anderen Programm aus aufzurufen, dass das ganze wie ein modeles Dialogfeld aussieht.
Also das aufgerufene Prog soll wie ein modales Dialogfeld über dem aufrufenden liegen. Und wenn man das aufgerufene Prog wieder schließt soll man erst wieder zum aufrufenden Prog kommen.Klingt kompliziert - isses hoffentlichnicht
Danke
-
Hast du es schon mit der Funktion
WinExec
ausprobiert. Ich habs noch nie ausprobiert weiß also auch nicht obs wie ien modaler Dialog aussieht. Aber ein anderes Programm kannst du damit aus deinem eigenen Programm aufrufen.
Ciao Andreas
-
Klingt gar nicht so kompliziert und ist bei jeder GUI für ein Kommandozeilenproramm üblich.
Hier eine Funktion aus meinem Explorer die das macht:
bool StartProcessAndWait(CString process, CString params, CString title, int show) { static STARTUPINFO StartupInfo; static LPSTARTUPINFO lpStartupInfo = &StartupInfo; static PROCESS_INFORMATION ProcessInfo; static LPPROCESS_INFORMATION lpProcessInfo = &ProcessInfo; lpStartupInfo->cb = sizeof( STARTUPINFO ); lpStartupInfo->lpDesktop = NULL; lpStartupInfo->lpTitle = title.GetBuffer(0); lpStartupInfo->dwX = 0; lpStartupInfo->dwY = 0; lpStartupInfo->dwXSize = 0; lpStartupInfo->dwYSize = 0; lpStartupInfo->dwFlags = STARTF_USESHOWWINDOW; lpStartupInfo->wShowWindow = show; CString start; start+=process; start+=" "; start+=params; if (!CreateProcess(NULL, start.GetBuffer(start.GetLength()), (LPSECURITY_ATTRIBUTES) NULL, (LPSECURITY_ATTRIBUTES) NULL, false, CREATE_NEW_CONSOLE, (LPVOID) NULL, (LPTSTR) NULL, lpStartupInfo, lpProcessInfo)) { CString strError; DWORD errCode = GetLastError(); strError.Format("Fehlercode: %i - ", errCode); return false; } WaitForSingleObject(lpProcessInfo->hProcess, INFINITE); return true; }
Der ganze obere mist ist nur das zusammenklamausern der Parameter für CreateProcess, welches das externe Programm startet. Nach dem starten warten wir mit WaitForSingleObject auf den Beenden des externen Programmes.
-edit-
Achja die Parameter sollte ich vielleicht noch kurz erleutern;)CString process -> Pfad der zu startenden ausführbaren Datei also z.B. 'C:\WinNT\notepad.exe'
CString params -> Die Parameter für die zu startende EXE Datei. Kann auch getrost ein Leerstring ("") sein.
CString title -> Der name der zu startenden Anwendung. Bei einem Konsolenprogramm ist das der Text der in der kopfzeile der Konsolenanwendung steht. Kann auch ein Leerstring sein.
int show -> die Anzeigeart des neuen Programms. Normalerweise SW_SHOW für sichtbar.
-
Ok, schaut ja schon mal gut aus...
Werd das mal probierenVielen Danke
-
Hi!
Habe dazu noch ne Frage: Kann man auch den Rückgabewert des gestarteten Programms ermitteln? Also den das Programm als Exitcode zurückgibt?
Grüsse,
code_pilot
-
Hi!
code_pilot schrieb:
Kann man auch den Rückgabewert des gestarteten Programms ermitteln? Also den das Programm als Exitcode zurückgibt?
So:
dwCode =::WaitForSingleObject(pi.hProcess,INFINITE); ::GetExitCodeProcess(pi.hProcess,&dwCode);
Gruß A.K.
-
jau danke klappt wunderbar
-
das habe ich jetzt probiert nach dem obigen code von georgehomes, allerdings kommt nun die fehlermeldung lokale funktionsdefinition nicht zulässig
kann mir jemand sagen wo und wie ich das definieren muss, und wo ich das Codestück in irgendeiner anwendung einsetzen muss...
thx