Wat meer info: prog draait onder admin/elevated privileges op Vista (aangezet in manifest).
Service status code van hierboven draait ook niet op Windows 2000, met dezelfde foutmelding.
Heb deze alternatieve code van het net gevonden die het wel doet.
Hoop dat ik eruit kom waar de verschillen liggen, als ik iets vind, bug report bij Lazarus...
Misschien in elk geval het beste om een klein testprogramma te maken en dat als bug aan te maken...
Code:
// Replacement code for faulty fpc services code from
//http://www.chami.com/tips/delphi/031498D.html
//-------------------------------------
// get service status
//
// return status code if successful
// -1 if not
//
// return codes:
// SERVICE_STOPPED
// SERVICE_RUNNING
// SERVICE_PAUSED
//
// following return codes
// are used to indicate that
// the service is in the
// middle of getting to one
// of the above states:
// SERVICE_START_PENDING
// SERVICE_STOP_PENDING
// SERVICE_CONTINUE_PENDING
// SERVICE_PAUSE_PENDING
//
// sMachine:
// machine name, ie: \SERVER
// empty = local machine
//
// sService
// service name, ie: Alerter
//
function ServiceGetStatus(
sMachine,
sService : string ) : DWord;
var
//
// service control
// manager handle
schm,
//
// service handle
schs : SC_Handle;
//
// service status
ss : TServiceStatus;
//
// current service status
dwStat : DWord;
begin
dwStat := -1;
// connect to the service
// control manager
schm := OpenSCManager(
PChar(sMachine),
Nil,
SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
begin
// open a handle to
// the specified service
schs := OpenService(
schm,
PChar(sService),
// we want to
// query service status
SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)then
begin
// retrieve the current status
// of the specified service
if(QueryServiceStatus(
schs,
ss))then
begin
dwStat := ss.dwCurrentState;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control
// manager handle
CloseServiceHandle(schm);
end;
Result := dwStat;
end;
//-------------------------------------
// return TRUE if the specified
// service is running, defined by
// the status code SERVICE_RUNNING.
// return FALSE if the service
// is in any other state, including
// any pending states
//
function IsServiceRunning(ServiceName: string): boolean;
begin
Result := SERVICE_RUNNING =
ServiceGetStatus(
'', ServiceName );
end;
Bookmarks