Mit Dienst Programm überwachen
-
Hallo,
habe mal wieder ein Problem
:Ich habe ein Programm geschrieben, welches immer laufen soll, und auch nicht vom Benutzer beendet werden soll. Jetzt habe ich einen Dienst geschrieben, welcher Überprüft ob mein Programm läuft, und falls nicht das Programm erneut startet. Dies funktioniert leider nur beim ersten mal. wenn ich mein Programm dann erneut beende, wird es nicht mehr gestartet.
Hier mein Quellcode:
Timer:
void __fastcall TService1::Timer2Timer(TObject *Sender) { if ( hNote ){ DWORD noteExitCode; if ( GetExitCodeProcess(hNote , ¬eExitCode) ) { if ( noteExitCode== STILL_ACTIVE ) { // immer noch an } else { CloseHandle( hNote ); hNote = ExecuteProcess("C:\\Puffer\\STLkonverter.exe", GetCurrentDir() ); } } } else{ hNote = ExecuteProcess("C:\\Puffer\\STLkonverter.exe", GetCurrentDir() ); } }ExecuteProcess:
HANDLE __fastcall TService1::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; SECURITY_ATTRIBUTES sa; HANDLE hReadPipe, hWritePipe; char Buffer[4000]; DWORD dwRead; sa.nLength = sizeof (SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = true; CreatePipe(&hReadPipe, &hWritePipe, &sa, 2500000); memset(&sStartInfo, 0, sizeof(STARTUPINFO)); sStartInfo.cb = sizeof (STARTUPINFO); sStartInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sStartInfo.wShowWindow = SW_HIDE; sStartInfo.hStdOutput = hWritePipe; 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; } else{ WaitForSingleObject(sProcessInfo.hProcess, 30000); ReadFile(hReadPipe,&Buffer,sizeof(Buffer), &dwRead, NULL); int i=0; AnsiString strOut=""; while (Buffer[i]) { strOut=strOut+Buffer[i++]; } RichEdit1->Add(strOut); } return sProcessInfo.hProcess; }Kann mir irgendwer sagen, warum es nur einmal ausgeführt wird?
Danke für die Hilfe.
-
Wird der Timer wieder neu gestartet?
-
Wo wird der Timer beendet?
-
? ? ? ? schrieb:
Dies funktioniert leider nur beim ersten mal. wenn ich mein Programm dann erneut beende, wird es nicht mehr gestartet.
wird der OnTimerEvent aufgerufen? wo im Code läuft was falsch?
ohne genäuere fehlbeschreibung oder geld für eine neue Kristallkugel wird das warscheinlich nichts
-
Mal n'par Vermutungen zu ExecuteProcess:
1. HANDLEs weden ungültig -> CreatePipe(&hReadPipe, &hWritePipe, &sa, 2500000);
2. -> WaitForSingleObject(sProcessInfo.hProcess, 30000); ?? 30 Sek nichts machen
bis
RichEdit1->Add(strOut); ?? wo ist im Service ein RichEdit
-
Hallo,
danke habe die Fehler gefunden.
thomas1 hatte Recht, da war ein haufen unnützes Zeug drinne.
Gruß