Deutsch
Forum

Programm als letztes beenden?

 
Hallo Profaner...

Gibt es eine Möglichkeit ein Programm beim Herunterfahren des Rechners als letztes beenden zu lassen?
 
19.05.2005  
 



Meinst Du - die Reihenfolge bestimmen - in der Kernel den Prozessen die kill.app.message sendet?

Oder meinst Du so etwas wie statt Autostart Autoend?

Von beidem wüsste ich nicht wie - wäre für mich aber trotzdem interessant was genau Du meinst.

Salve.
 
19.05.2005  
 



Verstehe die Frage nicht so ganz, mit ~WM_QUERYENDSESSION in einem Callback, kannste abfangen ob Windows beendet wird. Du selber als letztes, höchstens als Service oder Skript auf NT-Systemen. Ich glaube aber das trifft es noch nicht, oder ???
 
19.05.2005  
 



~WM_QUERYENDSESSION  ist auch nicht das goldene vom Ei - da man in NT-Systemen einen QUERYENDSESSIONTimeout von 0 einstellen kann. Also sicher ist solch Callback auch nicht umbedingt - auch wenn fast kein Schwein den QUERYENDSESSIONTimeout von 20.000 auf 0 (ms) setzt.

Ich jedoch habs getan.

Salve.
 
19.05.2005  
 



[quote:0ca25bf230=iF]Meinst Du - die Reihenfolge bestimmen - in der Kernel den Prozessen die kill.app.message sendet?
[/quote:0ca25bf230]
Hallo IF...

Ja, genau. Das hängt u.a. von der Startreihenfolge der Prozesse ab. Ich gehe mal ganz schwer davon aus, daß das gar nicht oder nur mit Trick geht.

@Thomas...
[quote:0ca25bf230]
Verstehe die Frage nicht so ganz, mit ~WM_QUERYENDSESSION in einem Callback, kannste abfangen ob Windows beendet wird.
[/quote:0ca25bf230]
Im Augenblick regelt das das Programm über ein Subclassing von ~WM_QUERYENDSESSION durch eine zweite EXE, die allein nur für das Subclassing zuständig ist. Ich wollte mal schauen, ob es da noch irgendwelche anderen Möglichkeiten gibt, als das Herunterfahren abzufangen.
[quote:0ca25bf230]
Du selber als letztes, höchstens als Service oder Skript auf NT-Systemen. Ich glaube aber das trifft es noch nicht, oder ???
[/quote:0ca25bf230]
Genau um NT-Systeme geht es. Beim Herunterfahren des Systems wird ja an jedes Programm die ~WM_QUERYENDSESSION gesendet.
Das Programm soll unbedingt solange laufen, wie Windows läuft, das ist wichtig!
Wenn ich es irgendwie erreichen könnte, daß das Prog unter NT erst als letztes die ~WM_QUERYENDSESSION erhält, könnte ich mir das Subclassing sparen und einiges würde etwas sauberer durchlaufen...
 
19.05.2005  
 




Michael
Wodrich
Hallo Andreas,

mir schmiert ab und an der Rechner ab (mit Prozessen überladen) und da ist mir aufgefallen:

Der FireFox ist der letzte, der sich verabschiedet, da ich immer mehrere Tabs offen habe. FireFox fragt jetzt, ob er wirklich beenden soll. Wenn ich die Frage auf dem Bildschirm lasse, dann ist außer dem Fuchs nichts mehr aktiv.

In Profan gibt es doch SetCloseMsg, vieleicht hilft das ja.

MfG
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
19.05.2005  
 



Hallo Michael...

SetCloseMsg fällt sowieso flach, da ich zur Zeit XProfan besitze.
FireFox dürfte das über das Subclassing von ~WM_QUERYENDSESSION regeln - das möchte ich nicht, da ich in meinem Programm dann zu viel selbst regeln müßte.
 
20.05.2005  
 



Hallo Thomas...

[quote:e3a546d485]
Du selber als letztes, höchstens als Service oder Skript auf NT-Systemen. Ich glaube aber das trifft es noch nicht, oder ???
[/quote:e3a546d485]
Eventuell trifft es das doch. Unter Windows9x wäre genau das die Lösung (RegisterServiceProcess), da brauche ich es aber nicht. Ein weiteres Problem wäre, das mein Service ein Fenster hätte. Ich könnte mir vorstellen, das NT da evtl. mit den Zugriffsrechten etwas streikt - da müßte ich vielleicht dann noch ein bischen tricksen...
Leider habe ich keinen blassen Schimmer, wie ich unter NT einen Service installiere. Kannst du - oder sonst jemand - mir vielleicht auf die Sprünge helfen?
 
20.05.2005  
 



[quote:6298a5d2c1=AH]
Leider habe ich keinen blassen Schimmer, wie ich unter NT einen Service installiere. Kannst du - oder sonst jemand - mir vielleicht auf die Sprünge helfen?[/quote:6298a5d2c1]
Hab Dir was aus dem CodeArchiv für PureBasic rausgesucht. Kannst es Dir erstmal ansehen, vielleicht auch selber übertragen, ansonsten meldest Dich nochmal. Ist nicht schwer (für mich ist XProfan schwerer )
KompilierenMarkierenSeparieren
; English forum:
; Author: Richard Eikeland
; Date: 12. April 2003
; angepaßt an 3.93 ts-soft
; Apr. 12, 2003
; Converted to PB by Richard Eikeland
; This code is posted as is with out any waranties.
;
#SERVICE_WIN32_OWN_PROCESS = $10
#SERVICE_WIN32_SHARE_PROCESS = $20
#SERVICE_WIN32 = #SERVICE_WIN32_OWN_PROCESS + #SERVICE_WIN32_SHARE_PROCESS
#SERVICE_ACCEPT_STOP = $1
#SERVICE_ACCEPT_PAUSE_CONTINUE = $2
#SERVICE_ACCEPT_SHUTDOWN = $4
#SC_MANAGER_CONNECT = $1
#SC_MANAGER_CREATE_SERVICE = $2
#SC_MANAGER_ENUMERATE_SERVICE = $4
#SC_MANAGER_LOCK = $8
#SC_MANAGER_QUERY_LOCK_STATUS = $10
#SC_MANAGER_MODIFY_BOOT_CONFIG = $20
#STANDARD_RIGHTS_REQUIRED = $F0000
#SERVICE_QUERY_CONFIG = $1
#SERVICE_CHANGE_CONFIG = $2
#SERVICE_QUERY_STATUS = $4
#SERVICE_ENUMERATE_DEPENDENTS = $8
#SERVICE_START = $10
#SERVICE_STOP = $20
#SERVICE_PAUSE_CONTINUE = $40
#SERVICE_INTERROGATE = $80
#SERVICE_USER_DEFINED_CONTROL = $100
;#SERVICE_ALL_ACCESS = #STANDARD_RIGHTS_REQUIRED | #SERVICE_QUERY_CONFIG | #SERVICE_CHANGE_CONFIG | #SERVICE_QUERY_STATUS | #SERVICE_ENUMERATE_DEPENDENTS | #SERVICE_START | #SERVICE_STOP | #SERVICE_PAUSE_CONTINUE | #SERVICE_INTERROGATE |#SERVICE_USER_DEFINED_CONTROL
#SERVICE_DEMAND_START = $3
#SERVICE_ERROR_NORMAL = $1
;- SERVICE_CONTROL
#SERVICE_CONTROL_STOP = $1
#SERVICE_CONTROL_PAUSE = $2
#SERVICE_CONTROL_CONTINUE = $3
#SERVICE_CONTROL_INTERROGATE = $4
#SERVICE_CONTROL_SHUTDOWN = $5
;-SERVICE_STATE
#SERVICE_STOPPED = $1
#SERVICE_START_PENDING = $2
#SERVICE_STOP_PENDING = $3
#SERVICE_RUNNING = $4
#SERVICE_CONTINUE_PENDING = $5
#SERVICE_PAUSE_PENDING = $6
#SERVICE_PAUSED = $7
Global ServiceStatus.SERVICE_STATUS, hServiceStatus.l, SERVICE_NAME.s, Finish.l
Declare Handler(fdwControl.l)
Declare ServiceMain(dwArgc.l, lpszArgv.l)
Declare WriteLog(Value.s)
Procedure Main()
hSCManager.l
hService.l
ServiceTableEntry.SERVICE_TABLE_ENTRY
b.l
cmd.s
;Change SERVICE_NAME and app name as needed
AppPath.s = "C:DevPureBasicworkdirNTServiceMyService.exe"
SERVICE_NAME = "MyService"
cmd = Trim(LCase(ProgramParameter()))

Select cmd

    Case "install" ;Install service on machine
    hSCManager = OpenSCManager_(0, 0, #SC_MANAGER_CREATE_SERVICE)
    hService = CreateService_(hSCManager, SERVICE_NAME, SERVICE_NAME, #SERVICE_ALL_ACCESS, #SERVICE_WIN32_OWN_PROCESS, #SERVICE_DEMAND_START, #SERVICE_ERROR_NORMAL, AppPath, 0, 0, 0, 0, 0)
    CloseServiceHandle_(hService)
    CloseServiceHandle_(hSCManager)
    Finish = 1
    Case "uninstall" ;Remove service from machine
    hSCManager = OpenSCManager_(0, 0, #SC_MANAGER_CREATE_SERVICE)
    hService = OpenService_(hSCManager, SERVICE_NAME, #SERVICE_ALL_ACCESS)
    DeleteService_(hService)
    CloseServiceHandle_(hService)
    CloseServiceHandle_(hSCManager)
    Finish = 1
    Default
    *sname.s = SERVICE_NAME
    ;Start the service
    ServiceTableEntrylpServiceName = @SERVICE_NAME
    ServiceTableEntrylpServiceProc = @ServiceMain()
    b = StartServiceCtrlDispatcher_(@ServiceTableEntry)
    WriteLog("Starting Service bResult=" + Str(b))

    If b = 0

        Finish = 1

    EndIf

EndSelect

Repeat

Until Finish =1

End
EndProcedure
Procedure Handler(fdwControl.l)
b.l

Select fdwControl

    Case #SERVICE_CONTROL_PAUSE
    ;** Do whatever it takes To pause here.
    ServiceStatusdwCurrentState = #SERVICE_PAUSED
    Case #SERVICE_CONTROL_CONTINUE
    ;** Do whatever it takes To continue here.
    ServiceStatusdwCurrentState = #SERVICE_RUNNING
    Case #SERVICE_CONTROL_STOP
    ServiceStatusdwWin32ExitCode = 0
    ServiceStatusdwCurrentState = #SERVICE_STOP_PENDING
    ServiceStatusdwCheckPoint = 0
    ServiceStatusdwWaitHint = 0 ;Might want a time estimate
    b = SetServiceStatus_(hServiceStatus, ServiceStatus)
    ;** Do whatever it takes to stop here.
    Finish = 1
    ServiceStatusdwCurrentState = #SERVICE_STOPPED
    Case #SERVICE_CONTROL_INTERROGATE
    ;Fall through To send current status.
    Finish = 1
    ;Else

EndSelect

;Send current status.
b = SetServiceStatus_(hServiceStatus, ServiceStatus)
EndProcedure
Procedure ServiceMain(dwArgc.l, lpszArgv.l)
b.l
WriteLog("ServiceMain")
;Set initial state
ServiceStatusdwServiceType = #SERVICE_WIN32_OWN_PROCESS
ServiceStatusdwCurrentState = #SERVICE_START_PENDING
ServiceStatusdwControlsAccepted = #SERVICE_ACCEPT_STOP | #SERVICE_ACCEPT_PAUSE_CONTINUE | #SERVICE_ACCEPT_SHUTDOWN
ServiceStatusdwWin32ExitCode = 0
ServiceStatusdwServiceSpecificExitCode = 0
ServiceStatusdwCheckPoint = 0
ServiceStatusdwWaitHint = 0
hServiceStatus = RegisterServiceCtrlHandler_(SERVICE_NAME, @Handler())
ServiceStatusdwCurrentState = #SERVICE_START_PENDING
b = SetServiceStatus_(hServiceStatus, ServiceStatus)
;** Do Initialization Here
ServiceStatusdwCurrentState = #SERVICE_RUNNING
b = SetServiceStatus_(hServiceStatus, ServiceStatus)
;** Perform tasks -- If none exit
;** If an error occurs the following should be used for shutting
;** down:
; SetServerStatus SERVICE_STOP_PENDING
; Clean up
; SetServerStatus SERVICE_STOPPED
EndProcedure
Procedure WriteLog(Value.s)
sfile.s = "MyServiceLog.txt"

If OpenFile(0, sfile)

    WriteStringN(Value)
    CloseFile(0)

Else

    If CreateFile(0,sfile)

        WriteStringN(Value)
        CloseFile(0)

    EndIf

EndIf

EndProcedure
Main()

Weiß jetzt bloß nicht was das HL mit dem Code macht

Gruß
thomas
(ts-soft)
 
20.05.2005  
 



Der Code wird nix nutzen - da wirken nur PureBasic-Befehle für den PureBasic-Compiler - und der compiliert ja native.

In C++ z.B. ists eigendlich auch nur eine Projekteinstellung - um als Dienst zu compilieren.

Salve.
 
20.05.2005  
 



*.l sind long
*.s sind string
*.b sind byte
*hallo hierbei handelt es sich um strukturen

#xxxx sind konstanten

funktionen mit _ am Ende sind Api-funktionen

Gruß
Thomas

 
20.05.2005  
 



[quote:676b84de14=iF]Der Code wird nix nutzen - da wirken nur PureBasic-Befehle für den PureBasic-Compiler - und der compiliert ja native.

In C++ z.B. ists eigendlich auch nur eine Projekteinstellung - um als Dienst zu compilieren.

Salve.[/quote:676b84de14]Da liegste etwas verkehrt, denke ich, sind nur API aufrufen mit gefüllten Strukturen, sowie auswertung der übergebenen Commandos. Sollte machbar sein. Das Programm wird nur als Service registriert und reagiert entsprechen. Wenn AH sich das angesehen hat, und meint es könne so gehen, werde ich es nach XProfan umsetzen, hoffe ich

Gruß
Thomas
 
20.05.2005  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.825 Betrachtungen

Unbenanntvor 0 min.
H.Brill18.11.2023
W.L.05.07.2017

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie