Konsolenfenster soll nirgendswo sichtbar sein!
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ist gelöst thX
-
Wäre schön, wenn du uns noch verrätst wie du´s gelöst hast. Möglicherweise haben andere Leute das gleiche Problem und wüssten gern, wie´s geht...
-
Jochen S. schrieb:
Programme können sich nicht selbst ausführen, wenn sie beendet wurden. Dafür braucht man dann zwei Prozesse. Das hab ich ja schon vorgeschlegen.
.NET kann sowas
-
Jetzt bin ich aber interessiert.
Aber die Programme schaffen das nicht aus eigener Kraft, oder?
-
Eigentlich schon. Es gibt ein bestimmtes Event, dass hier z.B. gut passen würde, welches abfängt, ob das Programm per Prozesskill geschlossen wird und jenachdem kann man dann da noch Code einfügen.
-
FreakY<3Cpp schrieb:
Eigentlich schon. Es gibt ein bestimmtes Event, dass hier z.B. gut passen würde, welches abfängt, ob das Programm per Prozesskill geschlossen wird und jenachdem kann man dann da noch Code einfügen.
Das ist übrigens kein .NET-Feature. Das kann man in jedem System machen, wo Programme Nachrichten/Signale bekommen, um sich zu beenden. Allerdings taugt die Lösung nicht, um einen Prozess unstoppbar zu machen, weil es in der Regel auch die Möglichkeit gibt, ein Programm ohne dieses Signal zu beenden.
-
Ist das denn auch der Fall, wenn man den Prozess mit Terminate Process beendet?
Dann gibt man Windows die anweisung, den Prozess zu löschen. Ob dann noch eine Nachricht an den entsprechenden Prozess gesendet wird? Ich glaube eher nicht.
-
DocShoe schrieb:
Wäre schön, wenn du uns noch verrätst wie du´s gelöst hast. Möglicherweise haben andere Leute das gleiche Problem und wüssten gern, wie´s geht...
Ich habs ihm per E-Mail geschickt. Aber ich kann den Code ja mal Posten:
#include <windows.h> #include <tlhelp32.h> using namespace std; bool ProcessRunning(const char* szProcess) { HANDLE hSnapshot; PROCESSENTRY32 ProcessEntry; ProcessEntry.dwSize = sizeof(PROCESSENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); bool found = false; if(Process32First(hSnapshot, &ProcessEntry)) do { if(!stricmp(ProcessEntry.szExeFile,szProcess))found = true; } while(Process32Next(hSnapshot, &ProcessEntry)); CloseHandle(hSnapshot); return found; } bool KillProcess(const char* szProcess) { HANDLE hSnapshot; PROCESSENTRY32 ProcessEntry; ProcessEntry.dwSize = sizeof(PROCESSENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); bool found = false; if(Process32First(hSnapshot, &ProcessEntry)) do { if(!stricmp(ProcessEntry.szExeFile,szProcess)) { HANDLE hProcess; hProcess = OpenProcess(PROCESS_TERMINATE,0,ProcessEntry.th32ProcessID); TerminateProcess(hProcess,0); CloseHandle(hProcess); found = true; } } while(Process32Next(hSnapshot, &ProcessEntry)); CloseHandle(hSnapshot); return found; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { while(1) { KillProcess("hl.exe"); if(!ProcessRunning("ProcessB.exe"))ShellExecute(NULL,NULL,"ProcessB.exe",NULL,NULL,NULL); if(!ProcessRunning("ProcessA.exe"))ShellExecute(NULL,NULL,"ProcessA.exe",NULL,NULL,NULL); Sleep(100); } }
Die exe muss man dann kopieren und einmal ProcessA.exe und die andere Kopie ProcessB.exe nennen. Die Prozesse verhindern die Ausführung von "hl.exe".
Das könnte man aber noch besser hinbekommen, ohne die Zwei Exe-Dateien.
Man müsste dann die Anzahl der Laufenden Prozesse mit dem Namen "ProcessA.exe" ermitteln und sollte die Anzahl < 2 sein, einfach das Programm nochmal starten.MfG, Jochen
-
gibt soetwas nicht probleme beim herunterahren? Da wird ja auch ein Prozess beendet Wenn er dann neugestartet wird, bevor der 2. proess beendet wird..... ?
-
Deswegen wird doch, zumindest unter Linux, nach nem Terminersignal noch ein Killsignal geschickt. Letzteres kann ein Prozess nicht mehr abfangen. Bei anderen OS gibts sicher ähnliche Mechanismen.
-
Unter Win32 beendet TerminateProcess den Prozess unter allen Umständen, wartet aber, bis alle ausstehenden IO Operation beendet oder abgebrochen wurden.
MSDN schrieb:
A process cannot prevent itself from being terminated.