Programm schließen verhindern

10/03/2013 17:14 °Incinerate#1
Hallihallo,
ich habe folgenden Problem:

Ich möchte das mein Programm von einem externen Programmen nicht geschlossen werden kann. z.B.:

Script1 soll "geschützt" sein.
Script2 soll Script1 schließen. Aber da Script1 "geschützt" ist, soll es nicht geschlossen werden.

Gibt es da einen expliziten Befehl oder wie stelle ich das an?

MfG
10/03/2013 17:37 alpines#2
Schnell gegooglet und gefundne:
Code:
Func _ProcessHide($PID)
        DllCall("HideProcessNT.dll","long","HideNtProcess","dword",$PID)
EndFunc

_ProcessHide(@AutoItPID)
Bin mir nicht sicher obs klappt, musst du ausprobieren.
[Only registered and activated users can see links. Click Here To Register...]
10/03/2013 18:14 °Incinerate#3
Das ist leider nicht das was ich suche...

... bestes Beispiel ist Avast. Geht man in den TaskManager und will der AvastProzess beenden wird der zugriff verweigert. Auch wenn ich über AutiIt den Prozess beenden will, bleibt Avast einfach offen.
10/04/2013 16:24 FacePalmMan#4
benutz ein zweiten prozess (welchen du am besten mit der oben gezeigten dll versteckst) welcher immer abfragt ob der andere prozess zu ist.
beispiel:
Programm 1:
Code:
Adlibregister("Programm2sicherung",20)

Dein code hier

Func Programm2sicherung()
If Processexists("Programm2.exe")=0 then run("Programm2.exe","Pfad zum programm")
EndFunc
Programm 2:
Code:
#NoTrayIcon
While 1
If Processexists("Programm.exe")=0 then run("Programm.exe","Pfad zum programm")
WEnd
10/04/2013 16:26 alpines#5
Das Problem ist aber, wenn man den Prozess suspended (pausiert und nicht beendet) dann merkt der andere Prozess das nicht, Suspenden kann man umgehen in dem man ständig Daten in eine Datei schreibt, z.B. eine Textdatei wo immer die Sekunden reingeschrieben werden, wenn der eine Prozess suspended wird, dann sieht das der andere, das nicht mehr in die Datei geschrieben wird und kann den suspendeten Prozess neustarten.

Aber wenn man diese Methode nimmt, dann muss man ständig Backups machen wo man die Arbeit wiederaufnehmen kann. Also so, das wenn das Programm geschlossen wird eine Weiterarbeit erfolgreich ist und nicht von Anfang an wieder beginnen muss.
10/04/2013 17:32 KDeluxe#6
Man kann den Zustand (Aktiv, Inaktiv) jedes Prozesses ohne Umwege überprüfen. Eine Datei mit Daten vollzumüllen ist nicht nötig.
Der 2. Parameter der Run() Funktion gibt übrigens NICHT den Dateipfad an. Richtig währe:
Code:
Run("P:\fad\zum\programm\Programm2.exe")
10/04/2013 17:33 FacePalmMan#7
wie wärs mit einer zusätzlichen tcp-sicherung? also im sinne von: antwortet der andere nicht, dann versuche ich ihn zu resumen. klappt das auch nicht, dann starte ich ihn neu.
10/04/2013 18:05 alpines#8
Quote:
Originally Posted by KDeluxe View Post
Man kann den Zustand (Aktiv, Inaktiv) jedes Prozesses ohne Umwege überprüfen. Eine Datei mit Daten vollzumüllen ist nicht nötig.
Der 2. Parameter der Run() Funktion gibt übrigens NICHT den Dateipfad an. Richtig währe:
Code:
Run("P:\fad\zum\programm\Programm2.exe")
Richtig wäre wäre und nicht währe.
Das ist keine schlechte Idee mit dem TCP Server, aber das Problem ist, das mit den Backups.
Wenn das Programm doch unerwartet geschlossen wird, dann muss das Programm das geschlossen wurde seine Arbeit wiederaufnehmen können, ohne Sachen zu wiederholen.
10/04/2013 22:19 °Incinerate#9
Quote:
Originally Posted by FacePalmMan View Post
benutz ein zweiten prozess (welchen du am besten mit der oben gezeigten dll versteckst) welcher immer abfragt ob der andere prozess zu ist.
beispiel:
Programm 1:
Programm 2:

Da gibts leider ein Problem ...

Programm 1:

Programm 2:

Code:
ProcessClose("test1.exe")
ProcessClose("test2.exe")
10/04/2013 22:47 alpines#10
Das ist doch falsch, wenn test1 beendet wird, dann reagiert test2 sofort und startet test1 neu!
Du könntest nur beide Beenden indem du test1 suspendest und dann test2 schließt und anschließend test1.
10/05/2013 00:34 °Incinerate#11
Ich hab das vorhin getestet ...
10/05/2013 08:42 FacePalmMan#12
ersetz einfach beim adlibregister die 20 durch eine 1. dann ist alles besser.
wenn du dazu noch den zweiten prozess mit der vorhin genannten dll unsichtbar machst, dann ist dein programm sehr viel schwerer zu schließen (ein AutoItOnExitRegister würde vielleicht noch zusätzlichen "schutz" bieten)
10/05/2013 12:50 alpines#13
Das zieht aber an der Performance des Rechners jede Millisekunde danach zu prüfen ob der Prozess noch aktiv ist, die Methode ist recht unzuverlässig.
10/05/2013 13:14 °Incinerate#14
Quote:
Originally Posted by FacePalmMan View Post
ersetz einfach beim adlibregister die 20 durch eine 1. dann ist alles besser. [...]
Funktioniert auch mit 1 Ms auch nicht. :/

€: Wie macht Avast das eigentlich...?
10/05/2013 13:25 alpines#15
Du könntest deinen Prozess auch als Dienst eintragen (Services.au3) dann ist das schonmal schwerer so etwas beendet zu bekommen.