Xbase-Anwendung über Task-Manager beenden

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Xbase-Anwendung über Task-Manager beenden

Beitrag von notloesung »

Hi,

gibt es eine Möglichkeit zu erfahren (ich will dann darauf reagieren können) wenn meine Xbase-Anwendung nicht "normal" beendet, sondern vom User über den Task-Manager "abgeschossen" wird. (Prozess beenden)?

Grüße,
Notloesung
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Juergen »

Hallo Notloesung,

wenn Du mit Express arbeitest, gibt es unter den GETOPTIONS
eine Option:

QUITQUERY MSG {||(schliessen()}

.
.
.

FUNCTION schliessen() //Wenn Windows beendet wird.
local nRueck:=0 //XBP_ALLOW, XBP_REJECT

IF abmeld() //Frage ob beendet werden soll
nRueck:=XBP_ALLOW
ELSE
nRueck:=XBP_REJECT
ENDIF

RETURN (nRueck)

Ansonsten siehe in der Alaska Hilfe das Ereignis:
xbeP_Quit der XbpWindow()-Klasse an.

Gruß

Jürgen
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

Guten Morgen,
Juergen hat geschrieben:wenn Du mit Express arbeitest, gibt es unter den GETOPTIONS eine Option
Das ist nicht der Fall.

Juergen hat geschrieben:Ansonsten siehe in der Alaska Hilfe das Ereignis:
xbeP_Quit der XbpWindow()-Klasse an.
Das habe ich bereits gemacht. Das xbeP_Quit Ereignis fange ich schon ab in der Hauptschleife ab

Code: Alles auswählen

      DO WHILE .T.
         nEvent := AppEvent( @mp1, @mp2, @oXbp )
         oXbp:handleEvent( nEvent, mp1, mp2 )

         IF nEvent == xbeP_Quit
            _AppQuit( .T. )
         ENDIF

      ENDDO
Leider greift es eben nicht wenn der Prozess über den Task-Manager abgebrochen wird. Das steht auch so in der Doku
Win32 - Auf Windows-Plattformen wird das xbeP_Quit Ereignis nur dann erzeugt, wenn das Betriebssystem heruntergefahren wird und der laufende Prozess vom Betriebssystem, nicht vom Anwender, beendet wird. Wenn ein Programm über den Task-Manager abgebrochen wird, entsteht ein xbeP_Close Ereignis.
Aber genau dieses Ereignis würde ich gerne abfangen wollen.

Bisher ist mir nur eine "Notloesung" :lol: eingefallen.
Prozess A startet beim Start einen Hilfsprozess B. Prozess B läuft nur um zu schauen ob Hauptprozess A läuft. Wird Prozess A "normal" beendet so beendet er vorher den Hilfsprozess B. Wird er über den Task-Manager abgebrochen, so wird der Hilfsprozess B nicht automatisch beendet, so dass dieser Hilfsprozess irgendwann merkt "Hauptprozess A ist nicht mehr da" und kann dann darauf reagieren.
Das gefällt mir aber deshalb nicht, weil der Hilfsprozess B ebenfalls über den Task-Manager abgebrochen werden könnte (oder kann ich diesen quasi unsichtbar starten?) Und außerdem bräuchte ich dann einen weiteren Prozess, der den Hilfsprozess "überwacht", und, und, und, ...

Deshalb hoffe ich dass vielleicht jem. Anderes 'ne bessere Idee hat ( :?: ).

Gruß,
Notloesung
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

wenn es nur um die Anzeige geht, müsste man die destroy() Methode damit bestücken. Eigentlich sollte die dann eine Meldung liefern und die Kontrolle übernehmen.

Früher habe ich mal sowas mit Batchdateien realisiert. Die Batch hat das Programm gestartet und wenn es anders als gewünscht beendet wurde habe ich es gerade neu gestartet. Dafür habe ich teilweise TXT Dateien verwendet: Programm erstellt ENDE.OK und in Batchdatei:

Code: Alles auswählen

if exists ENDE.OK goto ende
Programm starten...
könnte auch exist heißen ... oder ich setzte den Errorlevel auf 1 wenn das Ende erlaubt war:

Code: Alles auswählen

QUIT | CANCEL [<nErrorLevel>] 

if errorlevel==1 goto ende 
Heute müsste es aber auch möglich sein, eine EXIT PROCEDURE zu verwenden, die wenn nötig mit RunShell() asyncron das gleiche Programm neu startet ...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Xbase-Anwendung über Task-Manager beenden

Beitrag von AUGE_OHR »

hi,
notloesung hat geschrieben: sondern vom User über den Task-Manager "abgeschossen" wird. (Prozess beenden)?
du meinst also CRTL-ALT-DEL ? Du kannst den Taskmanager einfach
abschalten :

Code: Alles auswählen

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr
und setze (dword) auf 1.

gruss by OHR
Jimmy
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Notloesung,

wie Du schon richtig bemerktest, wird ein xbeP_Close - Ereignis beim Beenden (auch über TaskManager) eines Dialogfensters ausgelöst.

Du musst also abfragen, ob für Dein Haupt-Dialog dieses Ereignis auftritt.

entweder:

Code: Alles auswählen

oAppDlg:close := {  |uNIL1,uNIL2,o| App_Beenden() }
oder:

Code: Alles auswählen

WHILE .T. 

  nEvent := AppEvent( @mp1, @mp2, @oXbp ) 
  oXbp:handleEvent( nEvent, mp1, mp2 ) 

  IF nEvent == xbeP_Close .and. oXbp == oAppDlg
    App_Beenden() 
  ENDIF 

ENDDO 
Tschüs,
Sören
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Notloesung,

das Close-Ereignis liefert ja leider keinerlei Informationen über die Ursache. Es bleibt unklar, ob der Benutzer ein reguläres Close veranlasst hat oder ob der Prozess über den Taskmanager "abgeschossen" werden soll.

Die Idee mit dem Watchdog-Prozess ist doch gut. Wenn du diesen als Dienst implementierst ( ServiceApp() ), bleibt er für den Taskmanager in der Liste der Anwendungen unsichtbar. In der Liste der Prozesse kann er "in der Menge untertauchen" und ist nur für Eingeweihte erkennbar. Dienststart und Dienstbeendigung werden im Windows-eigenen Eventlog protokolliert, wenn ich nicht irre. Eventuell lässt sich über die Benutzerrechte steuern, ob der Dienst vom Benutzer beendet werden darf.

Um zu unterscheiden, ob die Anwendung "normal" oder via Taskmanager beendet worden ist, müssten dann allerdings die üblichen Wege zum Beenden des Programms über Alt+F4, Close-Box der Titelleiste und "Schließen"-Eintrag des Dialog-Systemmenüs gesperrt und durch einen selbst programmierten Close-Button ersetzt werden, der vor dem Schließen erst den Watchdog abschaltet.

Close-Box und "Schließen"-Eintrag im Systemmenü lassen sich über API-Aufrufe desaktivieren, wenn man nicht das Systemmenü insgesamt abschalten möchte.


Viele Grüße
Günter
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

Guten Morgen,

danke für die Tipps und Lösungsansätze.
Ich werde mal "basteln" und mein Ergebnis dann posten.
(Wird ein wenig dauern, bin gerade am etwas anderem dran.)

Gruß,
Notloesung
Antworten