![]() |
Get Service State
Hallo Leute
Ich habe jetzt einige Services Programmiert und möchte in einem VLC Programm diese Starten und Stoppen bzw überprüfen ob sie gestartet oder gestoppt sind. Ich habe viele Seiten durchsucht und auch bei hier einige Threads gelesen. Um zu überprüfen welchen Status ein Service hat habe ich mich für diese Lösung entschieden:
Code:
Jedoch wenn ich den Namen des Services angebe werdich ich bei Exit 2 immer aus der Procedure geworfen, da es das Service nicht kennt.
function TFrmManage.ServiceGetStatus(sService: String): Boolean;
var SCManager, SCService: THandle; ServiceStatus: TServiceStatus; begin Result:= false; SCManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); if SCManager = 0 then begin ShowMessage('Exit 1'); Exit; end; try SCService := OpenService(SCManager, PChar(sService), SERVICE_START or SERVICE_STOP or SERVICE_QUERY_STATUS); if SCService = 0 then begin ShowMessage('Exit 2'); Exit; end; try ZeroMemory(@ServiceStatus, SizeOf(ServiceStatus)); QueryServiceStatus(SCService, ServiceStatus); Result:= ServiceStatus.dwCurrentState = SERVICE_RUNNING; ShowMessage(BoolToStr(result)); finally CloseServiceHandle(SCService); end; finally CloseServiceHandle(SCManager); end; end; Als namen habe ich angegeben: Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS et\Services\MeinSrv Habe ich einen Falschen Namen angegeben oder ist ein Fehler im Code? |
AW: Get Service State
Die Win32 API Service-Funktionen wollen nur den Namen, nichts weiter. Kurz gesagt: Lass den Registry-Pfad weg.
Grüße Dalai |
AW: Get Service State
Was hast du denn bei deinem Service als Namen angegeben?
"Nur" den mußt du dann auch verwenden. CMD:
Delphi-Quellcode:
sc query
und da dann siehe SERVICE_NAME (manchmal kann auch der DISPLAY_NAME genutzt werden) |
AW: Get Service State
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Antworten.
Ich habe es jetzt auch mit dem Service Name versucht. Jedoch falle ich auf der selben Zeile raus :/ Bei SC Query wird mein Dienst nicht angezeigt obwohl er installiert ist. Auch im Registrierungs-Editor ist er aufgelistet wie im Bild unten zu sehen ist: |
AW: Get Service State
Wie wurde der Dienst installiert? Einfach nur Registry-Zweig anlegen klappt in der Regel nicht, weil der ServiceManager dann nichts davon mitbekommt.
Grüße Dalai |
AW: Get Service State
der dienst wurde mit CMD: MeinDienst.exe /install installiert
|
AW: Get Service State
Dann würde ich den Dienst nochmals deinstallieren und wieder installieren. Und danach testen mit
Code:
Grüße
sc query <dienstname>
Dalai |
AW: Get Service State
Habe ich gemacht. Mit sc query MeinDienst finde ich das Service. Ich kann es auch über die Dienste app starten und stoppen.
Nur meine Prozedur findet das Service nicht. (SCService = 0) |
AW: Get Service State
Also geht's nun mit sc query im Vergleich zu vorher? Das ist ja schon mal ein Fortschritt.
Ich empfehle, eine ordentliche Fehlerbehandlung zu machen. Also sowas wie
Delphi-Quellcode:
statt einfach nur eine generische Meldung auszugeben. Meine Vermutung: Starten und Stoppen von Diensten ist Administratoren vorbehalten, daher wird das Öffnen des Dienstes mit diesen Flags wegen fehlender Rechte nicht klappen. Wenn du nur den Status des Dienstes ermitteln willst, reicht das SERVICE_QUERY_STATUS.
if SCService = 0 then
RaiseLastOsError; Grüße Dalai |
AW: Get Service State
Dalei hat eigentlich schon alles gesagt.
Ansonsten probiere mal das hier:
Delphi-Quellcode:
Wenn dir dann ein fröhliches "Zugriff verweigert" entgegenschlägt, dann machst du nur
function TFrmManage.ServiceGetStatus(sService: String): Boolean;
var SCManager, SCService: SC_HANDLE; ServiceStatus: TServiceStatus; begin Result:= false; SCManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); if SCManager = 0 then begin ShowMessage('Exit 1'); Exit; end; try SCService := OpenService(SCManager, PChar(sService), SERVICE_START or SERVICE_STOP or SERVICE_QUERY_STATUS); if SCService = 0 then begin ShowMessage('Exit 2 - Endlich, nun weiß ich, warum es scheitert:' + sLineBreak + SysErrorMessage(GetLastError)); Exit; end; try ZeroMemory(@ServiceStatus, SizeOf(ServiceStatus)); QueryServiceStatus(SCService, ServiceStatus); Result:= ServiceStatus.dwCurrentState = SERVICE_RUNNING; ShowMessage(BoolToStr(Result, True)); finally CloseServiceHandle(SCService); end; finally CloseServiceHandle(SCManager); end; end;
Delphi-Quellcode:
SCService := OpenService(SCManager, PChar(sService), SERVICE_QUERY_STATUS);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz