Einzelnen Beitrag anzeigen

NicoDE
(Gast)

n/a Beiträge
 
#11

Re: Herausfinden ob ein bestimmter Service installiert ist

  Alt 4. Mai 2005, 12:34
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;
  Mit Zitat antworten Zitat