(Gast)
n/a Beiträge
|
Re: Herausfinden ob ein bestimmter Service installiert ist
4. Mai 2005, 13: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;
|
|
Zitat
|