这个很简单,我的一个程序中的一个模块,看看是不是你所需要的。// 服务相关操作
function ChangeServiceStatus(sMachine, ServiceExecuteName: String; StatusValue: DWORD): Boolean;
function ExtractFileNameEx(Const S: String): String;
Var
I: Integer;
T: String;
begin
Result := S;
for I := 0 to Length(Result) -1 do begin
T := T +Result[I +1];
if FileExists(T) then begin
Result := T;
Break;
end;
end;
end;{type
TStartType = (stAutomatic, stManual, stDisabled);
TStatus = (ssStopped, ssStarting, ssStopping, ssRunning,
ssContinuePending, ssPausePending, ssPaused);}
var
i : integer;
schm: SC_Handle; // 服务控制管理句柄
schs: SC_Handle; // service handle
lpServices : PEnumServiceStatus;
lpServices_: PEnumServiceStatus;
pcbBytesNeeded : DWORD; // 下一个缓冲所需字节
lpServicesReturned: DWORD; // 服务个数
lpResumeHandle : DWORD; // 指向下个未读服务入口点
lpServiceConfig : PQueryServiceConfig;
//lpServiceStatus : TServiceStatus; sServerName, sDisplayName: String;
sStartName, sExecuteName: String;
// fStatus: TStatus;
// fStartType: TStartType;
begin
Result := false;
// connect to the service control manager
schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_ALL_ACCESS);
// if failure
if schm <= 0 then
begin
CloseServiceHandle(schm);
exit;
end; lpResumeHandle := 0;
lpServices := nil;
repeat
EnumServicesStatus(schm, SERVICE_WIN32, SERVICE_ACTIVE or SERVICE_INACTIVE,
lpServices^, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle); GetMem(lpServices, pcbBytesNeeded); if Not EnumServicesStatus(schm, SERVICE_WIN32, SERVICE_ACTIVE or SERVICE_INACTIVE,
lpServices^, pcbBytesNeeded, pcbBytesNeeded, lpServicesReturned, lpResumeHandle) then
begin
FreeMem(lpServices);
Break;
end; lpServices_ := lpServices;
for i := 0 to lpServicesReturned -1 do
begin
sServerName := PEnumServiceStatus(lpServices_)^.lpServiceName;
sDisplayName := PEnumServiceStatus(lpServices_)^.lpDisplayName; schs := OpenService(schm, PChar(sServerName),
SERVICE_QUERY_CONFIG Or SERVICE_QUERY_STATUS);
if schs <> 0 then
begin
lpServiceConfig := nil;
QueryServiceConfig(schs, lpServiceConfig, 0, pcbBytesNeeded); GetMem(lpServiceConfig, pcbBytesNeeded);
if QueryServiceConfig(schs, lpServiceConfig, pcbBytesNeeded, pcbBytesNeeded) then
begin
{
case lpServiceConfig.dwStartType of
SERVICE_AUTO_START : fStartType := stAutomatic;
SERVICE_DEMAND_START: fStartType := stManual ;
SERVICE_DISABLED : fStartType := stDisabled ;
end;
} sStartName := lpServiceConfig.lpServiceStartName;
sExecuteName := lpServiceConfig.lpBinaryPathName;
sExecuteName := ExtractFileNameEx(sExecuteName);
if sExecuteName = ServiceExecuteName then
begin
FreeMem(lpServiceConfig);
CloseServiceHandle(schs);
ChangeServiceStatus_ChildModule(schm, sServerName, StatusValue);
CloseServiceHandle(schm);
end;
end;
FreeMem(lpServiceConfig);
{
if QueryServiceStatus(schs, lpServiceStatus) then
case lpServiceStatus.dwCurrentState of
SERVICE_STOPPED : fStatus := ssStopped;
SERVICE_START_PENDING : fStatus := ssStarting;
SERVICE_STOP_PENDING : fStatus := ssStopping;
SERVICE_RUNNING : fStatus := ssRunning;
SERVICE_CONTINUE_PENDING: fStatus := ssContinuePending;
SERVICE_PAUSE_PENDING : fStatus := ssPausePending;
SERVICE_PAUSED : fStatus := ssPaused;
end;
}
end;
CloseServiceHandle(schs);
Inc(lpServices_);
end;
FreeMem(lpServices);
until lpResumeHandle = 0;
// close service control manager handle
CloseServiceHandle(schm);
end;
function ChangeServiceStatus(sMachine, ServiceExecuteName: String; StatusValue: DWORD): Boolean;
function ExtractFileNameEx(Const S: String): String;
Var
I: Integer;
T: String;
begin
Result := S;
for I := 0 to Length(Result) -1 do begin
T := T +Result[I +1];
if FileExists(T) then begin
Result := T;
Break;
end;
end;
end;{type
TStartType = (stAutomatic, stManual, stDisabled);
TStatus = (ssStopped, ssStarting, ssStopping, ssRunning,
ssContinuePending, ssPausePending, ssPaused);}
var
i : integer;
schm: SC_Handle; // 服务控制管理句柄
schs: SC_Handle; // service handle
lpServices : PEnumServiceStatus;
lpServices_: PEnumServiceStatus;
pcbBytesNeeded : DWORD; // 下一个缓冲所需字节
lpServicesReturned: DWORD; // 服务个数
lpResumeHandle : DWORD; // 指向下个未读服务入口点
lpServiceConfig : PQueryServiceConfig;
//lpServiceStatus : TServiceStatus; sServerName, sDisplayName: String;
sStartName, sExecuteName: String;
// fStatus: TStatus;
// fStartType: TStartType;
begin
Result := false;
// connect to the service control manager
schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_ALL_ACCESS);
// if failure
if schm <= 0 then
begin
CloseServiceHandle(schm);
exit;
end; lpResumeHandle := 0;
lpServices := nil;
repeat
EnumServicesStatus(schm, SERVICE_WIN32, SERVICE_ACTIVE or SERVICE_INACTIVE,
lpServices^, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle); GetMem(lpServices, pcbBytesNeeded); if Not EnumServicesStatus(schm, SERVICE_WIN32, SERVICE_ACTIVE or SERVICE_INACTIVE,
lpServices^, pcbBytesNeeded, pcbBytesNeeded, lpServicesReturned, lpResumeHandle) then
begin
FreeMem(lpServices);
Break;
end; lpServices_ := lpServices;
for i := 0 to lpServicesReturned -1 do
begin
sServerName := PEnumServiceStatus(lpServices_)^.lpServiceName;
sDisplayName := PEnumServiceStatus(lpServices_)^.lpDisplayName; schs := OpenService(schm, PChar(sServerName),
SERVICE_QUERY_CONFIG Or SERVICE_QUERY_STATUS);
if schs <> 0 then
begin
lpServiceConfig := nil;
QueryServiceConfig(schs, lpServiceConfig, 0, pcbBytesNeeded); GetMem(lpServiceConfig, pcbBytesNeeded);
if QueryServiceConfig(schs, lpServiceConfig, pcbBytesNeeded, pcbBytesNeeded) then
begin
{
case lpServiceConfig.dwStartType of
SERVICE_AUTO_START : fStartType := stAutomatic;
SERVICE_DEMAND_START: fStartType := stManual ;
SERVICE_DISABLED : fStartType := stDisabled ;
end;
} sStartName := lpServiceConfig.lpServiceStartName;
sExecuteName := lpServiceConfig.lpBinaryPathName;
sExecuteName := ExtractFileNameEx(sExecuteName);
if sExecuteName = ServiceExecuteName then
begin
FreeMem(lpServiceConfig);
CloseServiceHandle(schs);
ChangeServiceStatus_ChildModule(schm, sServerName, StatusValue);
CloseServiceHandle(schm);
end;
end;
FreeMem(lpServiceConfig);
{
if QueryServiceStatus(schs, lpServiceStatus) then
case lpServiceStatus.dwCurrentState of
SERVICE_STOPPED : fStatus := ssStopped;
SERVICE_START_PENDING : fStatus := ssStarting;
SERVICE_STOP_PENDING : fStatus := ssStopping;
SERVICE_RUNNING : fStatus := ssRunning;
SERVICE_CONTINUE_PENDING: fStatus := ssContinuePending;
SERVICE_PAUSE_PENDING : fStatus := ssPausePending;
SERVICE_PAUSED : fStatus := ssPaused;
end;
}
end;
CloseServiceHandle(schs);
Inc(lpServices_);
end;
FreeMem(lpServices);
until lpResumeHandle = 0;
// close service control manager handle
CloseServiceHandle(schm);
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货