externes Programm starten
-
Ich möchte von meinem Programm aus ein anderes starten, wie mache ich das ?
[ Dieser Beitrag wurde am 11.07.2002 um 17:57 Uhr von Jansen editiert. ]
-
Schreibt mal bitte jemand ein schönes ShellExecute-Beipiel, damit wir das in die FAQ packen können? Danke!
In der Zwischenzeit hilft dir vielleicht das hier: http://www.bcbdev.com/faqs/faq71.htm
[ Dieser Beitrag wurde am 10.07.2002 um 12:57 Uhr von Jansen editiert. ]
-
Muss es unbeding ShellExecute sein ?
Ich bevorzuge eher CreateProcess, da man dort den Status des Programms herausfinden kann, z.Bsp. ob es noch läuft usw.HANDLE ExecuteProcess( const String & CommandLine, const String & WorkDir ) { STARTUPINFO sStartInfo; ZeroMemory( &sStartInfo, sizeof(STARTUPINFO) ); sStartInfo.cb = sizeof(STARTUPINFO); sStartInfo.wShowWindow = SW_SHOWDEFAULT; sStartInfo.dwFlags = STARTF_USESHOWWINDOW; PROCESS_INFORMATION sProcessInfo; ZeroMemory( &sProcessInfo, sizeof(PROCESS_INFORMATION) ); bool ok = CreateProcess( NULL, CommandLine.c_str(), NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, WorkDir.c_str() , &sStartInfo, &sProcessInfo ); if ( !ok ) { sProcessInfo.hProcess = 0; } return sProcessInfo.hProcess; }
Aufruf z.Bsp.:
// im Header ... HANDLE hNote; // im CPP on Button hNote = ExecuteProcess( "notepad", GetCurrentDir() ); notetimer->Enabled = true; // im on notetimer if ( hNote ){ DWORD noteExitCode; if ( GetExitCodeProcess(hNote , ¬eExitCode) ) { if ( noteExitCode== STILL_ACTIVE ) { // immer noch an } else { // Programm beendet notetimer->Enabled = false; CloseHandle( hNote ); } } }
Natürlich schreibe ich auch gern mal ein Shellexecute
mfg
Dis
-
Ich bevorzuge eher CreateProcess
Kanonen auf Spatzen? Zumindest in den meisten Fällen, oder?
Natürlich schreibe ich auch gern mal ein Shellexecute
Ja, bitte!
-
sowas?
void execute(AnsiString ziel) { long i; i=long(ShellExecute(0, "open", ziel.c_str(), 0, 0, SW_SHOWNORMAL)); //Fehlerabfang if(i <= 32) { if ( (i == SE_ERR_ACCESSDENIED) || (i == SE_ERR_SHARE) ) Application -> MessageBox("Die Datei wird bereits verwendet!", "Kommunikation", MB_OK + MB_ICONERROR); else if ( (i == SE_ERR_ASSOCINCOMPLETE) || (i == SE_ERR_NOASSOC) ) Application -> MessageBox("Die Dateiendung ist mit keinem Programm verknüpft!","Kommunikation", MB_OK + MB_ICONERROR); else Application -> MessageBox("Ein unerwarteter Fehler trat auf!" , "Kommunikation",MB_OK + MB_ICONERROR); } }
-
Wie geht ShellExecute bei Programmen wie net.exe ?
Da muss ich ja noch mehr angeben
(z.B.net use f: \\name\c$ "kennwort" /Domäne\USER: uname).
-
Hast du dir schon mal die Hilfe zu ShellExecute angesehen!?
-
hmpf... ich hab schon dutzende mal meine ShellExecute-Funktion gepostet und niemand wollte sie!
// forward-deklaration in nem header: void RunApplication(LPCTSTR FileName, LPCTSTR FileParam); // führt per ShellExecute die Anwendung, die mit der Dateiendung von FileName // assoziert ist aus, FileParam spezifiziert zusätzliche Aufrufparameter void RunApplication(LPCTSTR FileName, LPCTSTR FileParam) { int ret = (int) ShellExecute(0, "open", FileName, FileParam, 0, SW_SHOWNORMAL); if (ret <= 32) { AnsiString msg; switch(ret) { case ERROR_FILE_NOT_FOUND, SE_ERR_FNF : msg = "Die angegebene Datei '" + AnsiString(FileName) + "' wurde nicht gefunden!"; break; case ERROR_PATH_NOT_FOUND, SE_ERR_PNF : msg = "Der Pfad zur Datei '" + AnsiString(FileName) + "' wurde nicht gefunden!"; break; case ERROR_BAD_FORMAT : msg = "Die aufgerufene Anwendung ist ungültig oder beschädigt!"; break; case SE_ERR_ACCESSDENIED, SE_ERR_SHARE : msg = "Der Zugriff auf die Datei '" + AnsiString(FileName) + "' wurde vom Betriebssystem verweigert!"; break; case SE_ERR_ASSOCINCOMPLETE, SE_ERR_NOASSOC : msg = "Der angegebene Dateityp ist auf Ihrem Computer keiner Anwendung zugeordnet!"; break; case 0, SE_ERR_OOM : msg = "Zum Ausführen der Anwendung ist nicht genügend Arbeitsspeicher frei!"; break; default : msg = "Datei '" + AnsiString(FileName) + "' konnte nicht geöffnet werden!"; } Application->MessageBox(msg.c_str(), "Fehler", MB_OK + MB_ICONERROR); } }
aufruf-beispiele:
// ohne parameter RunApplication("meine.exe", 0); RunApplication("mailto:magic_sunday@gmx.de", 0); RunApplication("http://www.magic-sunday.de", 0); // mit parameter RunApplication("meine.exe", "1 2 3"); RunApplication("net", "use"); RunApplication("format", "a: /s"); // aufruf bei AnsiString-Übergabe AnsiString FileName = "c:\\windows\\calc.exe"; RunApplication(FileName.c_str(), 0);
[ Dieser Beitrag wurde am 10.07.2002 um 14:59 Uhr von Sunday editiert. ]
-
ich hab schon dutzende mal meine ShellExecute-Funktion gepostet und niemand wollte sie!
Naja, aber nu! Und späte Einsicht ist besser als gar keine, oder?
Wie wär's, wenn noch die von Vlad Tepes angesprochene Parameter-Übergabe mit eingearbeitet wird, damit das wirklich eine Komplettlösung ist?
-
Das ist cool. Vielen Dank schon mal.
-
so geänderte version! nun mit paramter-möglichkeit.
siehe vorigen post von mir...
-
Ich würde noch nen bool-Parameter namens "Show" angeben. Soetwas kann man z.B. dann gebrauchen, wenn ein Programm in der Konsole gestartet wird, man es aber nicht sichtbar haben will.
-
Jansen :
Kanonen auf Spatzen? Zumindest in den meisten Fällen, oder?Leider nicht
Denn die meisten kommen hinterher und fragen ob man nicht noch den Status des Programms noch abfragen kann (obs läuft oder nicht, usw).
Außerdem finde ich, dass die Funktion nicht größer ist als die Shellexecute.Dis
-
Dann benutze du es. Die meisten wollen ShellExecute(). Mein Wort drauf.
Hihi, FAQ editieren ist lustig! Wenn man das Prog überwachen will, geht auch ShellExecuteEx. Abgeschrieben von -King- aus dem WinAPI-Forum:
int main(void) { SHELLEXECUTEINFO sei; ZeroMemory((PVOID)&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.nShow = SW_SHOW; sei.lpFile = TEXT("notepad.exe"); ShellExecuteEx(&sei); if(sei.hProcess) { WaitForSingleObject(sei.hProcess, INFINITE); CloseHandle(sei.hProcess); } return(0); }
[ Dieser Beitrag wurde am 17.07.2002 um 01:32 Uhr von WebFritzi editiert. ]
-
naja, wenn man nur ein programm ausführen will oder ein .rtf oder .doc an word übergeben will, brauch man in der regel keine info über den laufenden status des programmes und ShellExecute reicht da vollkommen aus und jedesmal mit nem timer rum zu hantieren. ich weiss net...