Anwendung nach Start eines externen Programms beenden
-
Hallo Leute,
ich möchte eine kleine "autostart.exe" bauen, die folgendes tut:
- Datei "autostart.ini" auslesen
- Prüfen, ob der Registry-Schlüssel aus der Datei existiert (der enthält das zu startende Programm incl. Pfad)
- wenn Reg-Key existiert -> Programm starten, sonst "setup" starten
Das funktioniert schon. Allerdings möchte ich nach dem start des jeweiligen externen Programms, das ich mit dem "system"-Befehl aufrufe (setup oder anwendung) mein Programm beenden. Leider weiß ich nicht wie. Habe schon "exit(0)" und "_exit(0)" nach dem "system"-Befehl ausprobiert, aber das funktioniert leider nicht.
Außerdem würde ich gern, dass das Programm nicht in der Taskleiste erscheint. Ist das möglich?
Hier ist noch mein bisheriger Code:
// Registry-Schlüssel, der Anwendungsname (incl. Pfad) muss im Registry - Pfad aus der ini-Datei liegen und "App" heißen #include <iostream> #include <fstream> #include <sstream> #include <string> #include <windows.h> using namespace std; string setup, app; void getIni(){ ifstream input("autostart.ini"); string line = ""; while (input) { getline(input, line); while (input) { getline(input, line); stringstream ss; ss << line; string varName, value; getline(ss, varName, '='); getline(ss, value, '\"'); getline(ss, value, '\"'); if (varName == "Run") setup = value; else if (varName == "RegKey") app = value; } } input.close(); } string getRegKey(){ HKEY hKey = NULL; BYTE bData[MAX_PATH + 1] = {0}; DWORD dwDataLen = MAX_PATH; string result; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE ,app.c_str(), 0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS) result = "0"; if (RegQueryValueEx(hKey,"App",NULL,NULL,bData,&dwDataLen) == ERROR_SUCCESS) result = (string)((char*)bData); else result = "0"; RegCloseKey(hKey); return result; } int main() { // "setup" und "app" sind die daten aus der ini-Datei getIni(); // Reg-Key überprüfen string reg = getRegKey(); if (reg != "0"){ // Reg-Key existiert -> Programm starten reg = "\"" + reg + "\""; system(reg.c_str()); exit(0); }else{ // Reg-Key existiert nicht -> Setup starten setup = "\"" + setup + "\""; system(setup.c_str()); exit(0); } return 0; }
Die ini-Datei sieht so aus:
[App] RegKey="Software\Testfirma\Testprogramm\" [Setup] Run="setup.exe"
-
Nimm doch einfach CreateProcess...
http://msdn.microsoft.com/library/en-us/dllproc/base/createprocess.asp
-
Hallo Jochen,
vielen Dank, das funktioniert schon mal gut!
Gibt es noch eine Möglichkeit, das Konsolenprogramm minimiert laufen zu lassen? Im Moment geht halt immer ein Konsolenfenster auf und das Programm erscheint in der Task-Leiste. Kann man das irgendwie umgehen?
-
STARTUPINFO si; ZeroMemory(si, sizeof(si)); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; // oder SW_MINIMIZE
-
Hallo Jochen,
hab das jetzt eingebaut. Aber leider geht es noch nicht. Das Konsolenfenster springt immer noch kurz auf. Das ist nicht so schon, wenn man eine CD einlegt. Wenn ich das nicht möchte, dürfte ich wohl keine Konsolenanwendung schreiben? Ich kenne mich leider noch nicht aus in C++. Ich verwende nur einen Texteditor und das bcc32 zum Kompilieren. Kann ich damit auch was anderes machen als Konsolenanwendungen?
Hier ist noch einmal mein derzeitiger code:
... int main() { STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; // "setup" und "app" sind die daten aus der ini-Datei getIni(); // Reg-Key überprüfen string reg = getRegKey(); char *filename; if (reg != "0"){ // Reg-Key existiert -> Anwendung starten filename = new char[reg.length()+1]; strcpy(filename, reg.c_str()); }else{ // Reg-Key existiert nicht -> Setup starten filename = new char[setup.length()+1]; strcpy(filename, setup.c_str()); } STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInfo; // Start-Up-Info auf 0 ZeroMemory( &StartupInfo, sizeof( StartupInfo )); StartupInfo.cb=sizeof( StartupInfo ); // gewuenschtes Programm starten CreateProcess(NULL, filename, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartupInfo, &ProcessInfo); return 0; }
-
?????
Du solltest vielleicht auch das richtige STARTUPINFO nehmen... also ersetze "si" durch Dein "StartupInfo" und füge den Code hinter dem ZeroMemory ein (also fast ganz unten)...
-
Hallo Jochen,
das hab ich schon probiert. Ist das dann nicht die Startup-Info für das Programm, was ich über CreateProcess starte?
Ich möchte aber das eigentliche Programm (wo der ganze Code (s.o.) drin steht) beim Start minimiert laufen lassen, sodass das die Konsole sich gar nicht erst öffnet. Oder geht das nicht (, weil es eben eine Konsolenanwendung ist)?
-
Sag das doch gleich... dann stelle einfach Dein Projekt von "Console" auf "Windows" um... dazu musst Du nur die Linker-Einstellungen bzgl. "Subsystem" umstellen.
Dann noch Deinint main()
durch
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) ersetzen
...
-
Vielen Dank!!! Es funktioniert!!!