Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Herausfinden ob ein bestimmter Service installiert ist (https://www.delphipraxis.net/45322-herausfinden-ob-ein-bestimmter-service-installiert-ist.html)

toyoman 4. Mai 2005 09:28


Herausfinden ob ein bestimmter Service installiert ist
 
hallo

ich möchte möglichst einfach rausfinden ob ein bestimmter service installiert ist, bevor ich den Status diese Service abfrage.

wie ich den Status des Service abfrage ist mir klar und auch schon eingebaut, nur hab ich das Problem, dass wenn der Service NICHT installiert ist, die Abfrage als Resultat bringt der Service sei "running" also er laufe, was natürlich quatsch ist.

sakura 4. Mai 2005 09:50

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Folgende Funktion liefert E_FAIL zurück, wenn der Service nicht installiert ist. Getestet unter Win2003.
Delphi-Quellcode:
uses
   WinSvc;

function ServiceGetStatus(sMachine, sService: AnsiString): Integer;
var
   srvManager,srvHandle: SC_Handle;
   srvStatus: TServiceStatus;
   hStat: Integer;
begin
   hStat := E_FAIL;
   srvManager := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
   if srvManager > 0 then
   begin
      srvHandle := OpenService(srvManager, PChar(sService), SERVICE_QUERY_STATUS);
      if srvHandle > 0 then
      begin
         if QueryServiceStatus(srvHandle, srvStatus) then
            hStat := srvStatus.dwCurrentState;
         CloseServiceHandle(srvHandle);
      end;
      CloseServiceHandle(srvManager);
   end;
   Result := hStat;
end;
...:cat:...

toyoman 4. Mai 2005 10:13

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Zitat:

Zitat von sakura
Folgende Funktion liefert E_FAIL zurück, wenn der Service nicht installiert ist. Getestet unter Win2003.
Delphi-Quellcode:
uses
   WinSvc;

function ServiceGetStatus(sMachine, sService: AnsiString): Integer;
var
   srvManager,srvHandle: SC_Handle;
   srvStatus: TServiceStatus;
   hStat: Integer;
begin
   hStat := E_FAIL;
   srvManager := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
   if srvManager > 0 then
   begin
      srvHandle := OpenService(srvManager, PChar(sService), SERVICE_QUERY_STATUS);
      if srvHandle > 0 then
      begin
         if QueryServiceStatus(srvHandle, srvStatus) then
            hStat := srvStatus.dwCurrentState;
         CloseServiceHandle(srvHandle);
      end;
      CloseServiceHandle(srvManager);
   end;
   Result := hStat;
end;
...:cat:...

Funktioniert bei mir leider nicht, ich kriege trotzdem den Status 4 zurück, welcher eigentlich für running steht.
Ich versteh das nicht...

sakura 4. Mai 2005 10:30

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Zitat:

Zitat von toyoman
Funktioniert bei mir leider nicht, ich kriege trotzdem den Status 4 zurück, welcher eigentlich für running steht.

Welches OS nutzt Du?

...:cat:...

NicoDE 4. Mai 2005 10:49

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Warum nicht EnumServicesStatus(Ex)?
Alles andere ist nur eine Krücke.
(BTW, Handles sind keine Integer - ein Vergleich auf > 0 ist meiner bescheidenen Meinung nach 'unpassend')

Mephistopheles 4. Mai 2005 11:50

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Zitat:

Zitat von NicoDE
Warum nicht EnumServicesStatus(Ex)?

Weil man da keine Handles braucht :zwinker: ... oder so :gruebel:

Zitat:

Zitat von NicoDE
(BTW, Handles sind keine Integer - ein Vergleich auf > 0 ist meiner bescheidenen Meinung nach 'unpassend')

Integer schon, aber nicht vorzeichenbehaftet ;) ... aber hier reicht's den Leuten wohl - und für INVALID_HANDLE_VALUE wird es ja auch funktionieren. Nur später, wenn dann wirklich mal ein Fehler auftaucht, sucht man sich tot :mrgreen:

toyoman 4. Mai 2005 12:06

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Zitat:

Zitat von sakura
Zitat:

Zitat von toyoman
Funktioniert bei mir leider nicht, ich kriege trotzdem den Status 4 zurück, welcher eigentlich für running steht.

Welches OS nutzt Du?

...:cat:...

XP SP1

Mephistopheles 4. Mai 2005 12:15

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Schonmal EnumServicesStatusEx() oder EnumServicesStatus() versucht? Oder muß man hier immer sofort ein mundgerechtes Beispiel dazugeben?!

toyoman 4. Mai 2005 12:30

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Zitat:

Zitat von Mephistopheles
Schonmal EnumServicesStatusEx() oder EnumServicesStatus() versucht? Oder muß man hier immer sofort ein mundgerechtes Beispiel dazugeben?!

was soll diese Aussage nun bringen?
Ich habe nicht nach einem mundgerechten Beispiel gesucht sondern nach einer Möglichkeit.
Solche Aussagen liebt man wirklich :roll:

Mephistopheles 4. Mai 2005 12:32

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Ja das war ein Hinweis schon weiter oben von Nico. Aber du ignorierst offenbar Nicos Vorschlag geflissentlich, weil du dann die Doku durchlesen müßtest o.ä?!

Ich werde mich mal eben an ein kleines Beispiel setzen, damit du nicht zu sehr suchen mußt ... dauert ein paar Minuten. Also Geduld.

NicoDE 4. Mai 2005 12:34

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Delphi-Quellcode:
uses
   WinSvc;

type
  TAnswer = (aUnknown, aYes, aNo);

function IsServiceInstalled(const MachineName, ServiceName: string;
  ServiceType: DWORD = SERVICE_DRIVER or SERVICE_WIN32;
  ServiceState: DWORD = SERVICE_STATE_ALL): TAnswer;
const
  MAX_SERVICE_NAME = 256;
  MAX_DISPLAY_NAME = 256;
type
  PEnumServiceStatusBuffer = ^TEnumServiceStatusBuffer;
  TEnumServiceStatusBuffer = record
    EnumService: TEnumServiceStatus;
    ServiceName: array [0..MAX_SERVICE_NAME-1] of Char;
    DisplayName: array [0..MAX_DISPLAY_NAME-1] of Char;
  end;
var
  SCManager: SC_HANDLE;
  EnumBuffer: array [0..7] of TEnumServiceStatusBuffer; // ~4KB Stack size
  BytesNeeded: DWORD;
  ResumeHandle: DWORD;
  ServicesReturned: DWORD;
  Service: PEnumServiceStatus;
  Index: DWORD;
begin
  Result := aUnknown;
  SCManager := OpenSCManager(PChar(MachineName), SERVICES_ACTIVE_DATABASE,
    SC_MANAGER_ENUMERATE_SERVICE);
  if (SCManager <> 0) then
    try
      Result := aNo;
      ResumeHandle := 0;
      while EnumServicesStatus(SCManager, ServiceType, ServiceState,
        EnumBuffer[0].EnumService, SizeOf(EnumBuffer), BytesNeeded,
        ServicesReturned, ResumeHandle) or
        (GetLastError = ERROR_MORE_DATA) do
      begin
        Service := @EnumBuffer[0].EnumService;
        for Index := 1 to ServicesReturned do
        begin
          if (StrIComp(PChar(ServiceName), Service.lpServiceName) = 0) then
          begin
            Result := aYes;
            Break;
          end;
          Inc(Service);
        end;
        if (Result = aYes) then
          Break;
        if (ResumeHandle = 0) then
          Break;
      end;
    finally
      CloseServiceHandle(SCManager);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  case IsServiceInstalled(EmptyStr, 'Messenger') of
    aUnknown:
      ShowMessage('Vielleicht.');
    aYes:
      ShowMessage('Scheint so.');
    aNo:
      ShowMessage('Wohl nicht.');
  else
    ShowMessage('Hmmm.');
  end;
end;

Mephistopheles 4. Mai 2005 12:52

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Danke Nico! Das spart mir Zeit :zwinker:

toyoman 4. Mai 2005 13:00

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Zitat:

Zitat von Mephistopheles
Ja das war ein Hinweis schon weiter oben von Nico. Aber du ignorierst offenbar Nicos Vorschlag geflissentlich, weil du dann die Doku durchlesen müßtest o.ä?!

Ich werde mich mal eben an ein kleines Beispiel setzen, damit du nicht zu sehr suchen mußt ... dauert ein paar Minuten. Also Geduld.

hääää? ich hab überhaupt nichts ignoriert!!
ich hab lediglich die frage von sakura beantwortet!
ich würds nochmals durchlesen

toyoman 4. Mai 2005 13:10

Re: Herausfinden ob ein bestimmter Service installiert ist
 
Danke an Nico und die Beteiligten

Es funzt :)

aber nochmal... ich hab nicht gewartet das mir einer den code hinfözelt nei nein..
das habt ihr falsch verstanden. ich habe nix dergleichen verlauten lassen, also bitte nicht alle Foren User in den gleichen Topf werfen. Habe in der Zwischenzeit nämlich im Internet geforscht und ähnliche Funktionen aufgetrieben... war also nicht untätig wie mir der Mephistopheles unterstellen will...

amen


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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