1、关于TServiceManager控件
WIKI上的内容很少,只有判断服务是否存在的代码(不能进行遍历所有服务,调用Services.Items是空的):
program ServiceTest;
// Check if a certain process is running.
{
KaTeX parse error: Expected 'EOF', got '}' at position 12: mode objfpc}̲{
H+}
uses
Classes,
SysUtils,
ServiceManager,
JwaWinSvc {for services declarations};
function IsServiceRunning(ServiceName: string): boolean;
{description Checks if a Windows service is running}
var
Services: TServiceManager;
ServiceStatus: TServiceStatus;
begin
//Check for existing services
//equivalent to sc query
Services := TServiceManager.Create(nil);
try
try
Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
//We don’t need more access permissions than this; by default
//the servicemanager is trying to get all access
Services.Connect; //Now connect with requested access level
Services.GetServiceStatus(ServiceName, ServiceStatus);
Result := (ServiceStatus.dwCurrentState = SERVICE_RUNNING);
Services.Disconnect;
except
on E: EServiceManager do
begin
// A missing service might throw a missing handle exception? No?
{LogOutput('Error getting service information for ’ + ServiceName +
'. Technical details: ’ + E.ClassName + ‘/’ + E.Message); }
Result := False;
raise; //rethrow original exception
end;
on E: Exception do
begin
{LogOutput('Error getting service information for ’ + ServiceName +
'. Technical details: ’ + E.ClassName + ‘/’ + E.Message); }
Result := False;
raise; //rethrow original exception
end;
end;
finally
Services.Free;
end;
end;
const
ServiceToTest = ‘SamSs’;
//Security Accounts Manager, should be running, at least on Vista
begin
WriteLn(‘Starting test for ’ + ServiceToTest + ’ service.’);
if IsServiceRunning(ServiceToTest) then
WriteLn(‘The ’ + ServiceToTest + ’ service is running’)
else
WriteLn(‘The ’ + ServiceToTest + ’ service is not running’);
end.
在https://forum.lazarus.freepascal.org/index.php/topic,59497.msg443560.html#msg443560上找到代码:首先是Access属性的值要设定,然后RefreshOnConnect应该置为TURE:
procedure TForm1.Button1Click(Sender: TObject);
var
Num_of_Services: longint;
i: Integer;
entry: TServiceEntry;
begin
servicemanager1.Access := SC_MANAGER_ALL_ACCESS;
ServiceManager1.RefreshOnConnect := True;
ServiceManager1.Connect();
Num_of_Services :&#