Italia
Foro

Programm als letztes beenden?

 
- Page 1 -


Hallo Profaner...

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



 
- Page 1 -


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?
 
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 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)
 
20.05.2005  
 



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.
 
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

Saluto
Thomas

 
20.05.2005  
 



[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
 
20.05.2005  
 



 
- Page 2 -


ok.

Salve.
 
20.05.2005  
 




CB
Hallo Andreas!
[quote:4cca043a78]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:4cca043a78]
Ganz einfach: (Admin)
Systemsteuerung - Verwaltung - Dienste.
Ggf. mußt Du vorher in Menu anpassen: Verwaltung Mostra aktivieren.
Re. Maus auf einen Dienst - Eigenschaften.
Und schon kannst Du Dich austoben.

Christian
 
XProfan 8/9.1, Win XP, AMD 64/3200
20.05.2005  
 



Bestens Dank per eure Mithilfe, da ist schon sehr viel brauchbares dabei.

@Thomas:
In Profan kenne ich mich recht gut aus - bei anderen Sprachen sieht das schon schlechter aus .
Die APIs, die in deinem Quelltext vorkommen, entsprechen eigentlich denen, die ich mir finora angesehen habe (CreateService, OpenSCManager). Die Sache müßte also auch in Profan machbar sein. Sämtliche Flags stehen scheinbar auch mit drin (habs nur überflogen), scheint also im Prinzip brauchbar zu sein...

@Christian: Danke per den Tipp, ich werde mal schauen, ob das unter 2000 auch geht!
 
20.05.2005  
 



Hallo Andreas,
hab mal ein Teilstück des Codes nach XProfan übersetzt, so das der Rest eigentlich einfach zu ersehen ist. Ich hoffe es hilft Dir weiter.
KompilierenMarkierenSeparieren
 $H windows.ph
 $H Structs.ph
Global ServiceStatus.SERVICE_STATUS, hServiceStatus.l, SERVICE_NAME.s, Finish.l
Declare ServiceStatus# , hServiceStatus&, SERVICE_NAME$, Finish&
Dim ServiceStatus#, ~SERVICE_STATUS
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

Proc Handler

    Parameters fdwControl&

    If fdwControl& = ~SERVICE_CONTROL_PAUSE

        ** Do whatever it takes To pause here.
        ServiceStatus#.dwCurrentState = ~SERVICE_PAUSED

    ElseIf fdwControl& = ~SERVICE_CONTROL_CONTINUE

        ** Do whatever it takes To continue here.
        ServiceStatus#.dwCurrentState = ~SERVICE_RUNNING

    ElseIf fdwControl& = ~SERVICE_CONTROL_STOP

    ElseIf fdwControl& = ~SERVICE_CONTROL_INTERROGATE

    EndIf

    ~SetServiceStatus(hServiceStatus&, Addr(ServiceStatus#))

../references-fonction/xprofan/endproc/'>EndProc


Ist nur soviel, wie per die Übersetzung erforderlich ist. Solltest Du nicht klarkommen, werde Io l' Rest auch anpassen, das kann dann aber etwas dauern, da ich noch andere Dinge erledigen muß

Saluto
Thomas
 
20.05.2005  
 



... kann etwas dauern, bis ich mich damit beschäftigen kann, ich denke aber, ich komme klar. Besten Dank!
 
20.05.2005  
 



Die Lösung per mein Problem scheint die API SetProcessShutdownParameters zu sein.
 
15.07.2005  
 



Ok, das war die Lösung. Mit dieser API läßt sich festlegen, wann genau meine Anwendung beim Herunterfahren beendet wird.
 
16.07.2005  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

3.874 Views

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

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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