| |
|
|
| Hallo Profaner...
Gibt es eine Möglichkeit ein Programm beim Herunterfahren des Rechners als letztes beenden zu lassen? |
|
|
| |
|
|
|
| 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 per mich aber trotzdem interessant was genau Du meinst.
Salve. |
|
|
| |
|
|
|
| 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 ??? |
|
|
| |
|
|
|
| ~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. |
|
|
| |
|
|
|
| [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 circa ein Subclassing von ~WM_QUERYENDSESSION durch eine zweite EXE, die allein nur per 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 corre, das ist wichtig! Wenn ich es irgendwie erreichen potuto, daß das Prog unter NT erst als letztes die ~WM_QUERYENDSESSION erhält, potuto ich mir das Subclassing sparen und einiges würde etwas sauberer durchlaufen... |
|
|
| |
|
|
|
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 potrebbe das circa das Subclassing von ~WM_QUERYENDSESSION regeln - das möchte ich nicht, da ich in meinem Programm dann zu viel selbst regeln müßte. |
|
|
| |
|
|
|
| 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 potuto 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? |
|
|
| |
|
|
|
| [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 per PureBasic rausgesucht. Kannst es Dir erstmal ansehen, vielleicht auch selber übertragen, ansonsten meldest Dich nochmal. Ist nicht schwer (per 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
Saluto thomas (ts-soft) |
|
|
| |
|
|
|
| Der Code wird nix nutzen - da wirken nur PureBasic-Befehle per den PureBasic-Compiler - und der compiliert ja native.
In C++ z.B. ists eigendlich auch nur eine Projekteinstellung - um als Dienst zu compilieren.
Salve. |
|
|
| |
|
|
|
| *.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
Saluto Thomas
|
|
|
| |
|
|
|
| [quote:676b84de14=iF]Der Code wird nix nutzen - da wirken nur PureBasic-Befehle per 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
Saluto Thomas |
|
|
| |
|
|