Programmabbruch verhindern

Hallo

ich habe ein Proggi, welches nicht durch den Benutzer verändert werden darf. D.h. es darf auch nicht über den Taskmanager von Win98 beendet werden können.

Zummindest würde ich noch ein paar Befehle (schließen von Dateien) ausführen, bevor das Programm zwangsweise geschloßen wird.

Vielen Dank schon ein mal!

Bis dann, dann

S. Lorenz

Hi Bassi :smile:

Der Task-Manager pingt dein Programm mit einer Standard-Nachricht. Bekommt er kein Pong, wird dies als Absturz interpretiert und der Task-Manager beendet das Programm.

Wenn die Nachrichten-Schleife deiner Anwendung aber aktiv ist (was eigentlich stets der Fall sein sollte), pongt das Programm. Der Task-Manager leitet dann einen kontrollierten Programmabbruch ein.

In C/C++ kannst du mit der Bibliotheksfunktion „atexit()“ eine Funktion festlegen, die vor dem endgültigen Ende des Programms noch ausgeführt werden soll. Natürlich habe ich den Namen des #include-Files vergessen, aber der ist ja leicht rauszufinden …

cu Stefan.

Hallo,

vielen vielen Dank!!!

Leider habe ich vergessen zu erwähnen, dass ich das mit Delphi5 realisieren will…

Ich will das Programm umbedingt im Speicher behalten. Notfalls soll das Proramm sich selbst neu starten, wenn es geschloßen werden soll.
Was passiert dann aber beim beenden von Windows ?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Bassi :smile:

Leider habe ich vergessen zu erwähnen,
dass ich das mit Delphi5 realisieren
will…

Pascal bzw. Delphi ist nicht so sehr mein Ding. Aber ich bin sicher, dass es dort eine ähnliche Funktion wie atexit() gibt.

Ich will das Programm umbedingt im
Speicher behalten. Notfalls soll das
Proramm sich selbst neu starten, wenn es
geschloßen werden soll.

Du kannst auf keinen Fall das Programm selbst neu starten. Du kannst lediglich eine neue Instanz des Programms starten. Diese hat dann aber ihren eigenen Datenbereich im RAM und alle Variablen werden zurückgesetzt. Du müsstest deine Infos also in Dateien ablegen!

Was passiert dann aber beim beenden von
Windows ?

Beim Beenden von Windows wird der Start von Anwendungsprogrammen nicht mehr zugelassen, Windows ignoriert den Startaufruf einfach. Du kannst also getrost deine obige brute force Methode einsetzen.

cu Stefan.

PS: Denk dran, wer sich zu sehr auf Fenster spezialisiert, wird sie irgendwann nur noch putzen :smile:)

Wenn Du Nachrichten des Fensters empfangen kannst, bekommst Du für das Schließen des
Fensters eine Nachricht:

if (msg.message == WM_QUIT)
{

}

Über diese kannst Du gezielt den Abbruch erfahren.

P.s. Wie das in Delphi ausschaut weiß ich nicht. Aber vllt bringt Dich das weiter.

Gruß

  • Micha -

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Sebastian,

in Delphi gibt´s hierfür das Ereignis TForm.OnClose des Hauptfensters.

Wenn Du Action auf caNone setzt, kannst Du verhindern, daß der TaskManager Deine Applikation schließt.

Servus,

Manfred

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi

ich habe ein Proggi, welches nicht durch
den Benutzer verändert werden darf. D.h.
es darf auch nicht über den Taskmanager
von Win98 beendet werden können.

Mmh dazu fällt mir aud die schnelle nur ein…
Du könntest das Prog. einfach vor dem Taskmanager verstecken und zwar so:

procedure blabla;
var hndl : thandle;
begin
hndl=GetWindow(handle,GW_OWNER);
ShowWindow(hndl,SW_HIDE);
end;

So lässt es sich zumindest nicht über den Task-Manager abschiessen…
Ich glaub’ auf www.basicpro.de unter Tips&Tricks stand irgendwo, wie man das schliessen verhindern kann ( oder zumindest das Programm dann gleich wieder startet ).
Da das auf API-Funktionen beruht hat, müsste es aber leicht nach Delphi portierbar sein…

Naja hoffe es hilft :smile:

Brain

Entweder die OnCloseAction auf caNone setzen, oder ein OnCloseQuery-Ereignis setzen und da drin CanClose := False; reinsetzen. Dann ist das Programm auch nicht durch den Taskmanager schließbar. Zum Verstecken vorm TM gibts die Funktion RegisterServiceProcess aus der Kernel32.dll. Was die genau übergeben kriegt weiß ich jetzt nicht so genau, aber von den beiden Parametern bestimmt der 2. ob das Programm in der Taskliste sichtbar ist oder nicht.
Drück in delphi einfach Strg-Leertaste und schreib die ersten Buchstaben der Funktion. Sicher kommt dann schon der entsprechende Eintrag in der Liste.

Hallo,

vielen Dank für Eure Antworten.
Mein Problem ist leider, dass die PC-Welt mein Proggi getestet hat und dies mit einem anderen Taskmanager abschießen konnte.
Aus dem normalen habe ich Proggi ja schon versteckt.
Mich interessiert die Möglichkeit, dass das Programm gleich neu gestartet wird.

Bei welchem Ereignis sollte ich das tun ?
Bei wm_terminate vielleicht ? Oder ist es da für einen zuverlässigen Start schon zu spät ?

Vielen Dank schon ein mal!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das Fenster auf Unsichtbar zu setzen bringt nichts, da es weiterhi im Taskmanager erscheint. Aber wenn jemand weiß wie man wirklich effetiv da was versteckt (auch unter NT) soll sich melden. BRauch och für nen Keyhook :wink:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich kenne kein vor dem Taskmanager verstecktes Programm das nicht mit WPS oder Task&DLL abgeschossen werden kann. Das ist ja eigentlich auch nicht der Sinn der Sache wenn man ein Programm startet. Was den Neustart bei Beendigung angeht, dann nimm doch im OnCloseQuery-Ereignis die Winexec-Funktion und übergib ihr Application.ExeName. Dazu darfst Du aber nicht Mehrfachinstanzen Deines Proggies verboten haben, sonst klappts nicht.

Form1.OnCloseQuery(…
begin
CanClose:=False;
WinExec(Application.ExeName);
CanClose:=True;
end;

Mehrfachinstanzen verhindern:
if FindWIndow(‚TForm1‘,nil)0 then Exit;

Statt TForm1 mußt Du latürnich einen eindeutigen speziellen Namen nehmen. z.b. ‚TMySpecialUniqueApplicationMainFormTypeName‘

)