王朝网络
分享
 
 
 

How to control Windows services

王朝delphi·作者佚名  2006-01-10
宽屏版  字体: |||超大  

How to control Windows services

unit cwinsrvc;

interface

function ServiceGetStrCode(nID : integer) : string;

function ServiceGetStatus(sMachine,

sService : string) : DWord;

function ServiceRunning(sMachine,

sService : string) : boolean;

function ServiceStopped(sMachine,

sService : string) : boolean;

function ServiceStart(sMachine,

sService : string) : boolean;

function ServiceStop(sMachine,

sService : string) : boolean;

implementation

uses Windows, SysUtils, WinSvc;

// convert status codes returned by

// ServiceGetStatus() to string values

function ServiceGetStrCode(nID : integer) : string;

var

s : string;

begin

case nID of

SERVICE_STOPPED : s := 'STOPPED';

SERVICE_RUNNING : s := 'RUNNING';

SERVICE_PAUSED : s := 'PAUSED';

SERVICE_START_PENDING : s := 'START/PENDING';

SERVICE_STOP_PENDING : s := 'STOP/PENDING';

SERVICE_CONTINUE_PENDING : s := 'CONTINUE/PENDING';

SERVICE_PAUSE_PENDING : s := 'PAUSE/PENDING';

else

s := 'UNKNOWN';

end;

Result := s;

end;

// 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

schm : SC_Handle; //service control manager handle

schs : SC_Handle; // service handle

ss : TServiceStatus; // service status

dwStat : DWord; // current service status

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

// we want to query service status

schs := OpenService( schm, PChar(sService),

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 ServiceRunning(sMachine,

sService : string) : boolean;

begin

Result := SERVICE_RUNNING =

ServiceGetStatus(sMachine, sService);

end;

// Return TRUE if the specified service was stopped,

// defined by the status code SERVICE_STOPPED.

function ServiceStopped(sMachine,

sService : string) : boolean;

begin

Result := SERVICE_STOPPED =

ServiceGetStatus(sMachine, sService);

end;

// Return TRUE if successful

function ServiceStart(sMachine,

sService : string) : boolean;

var

schm,

schs : SC_Handle;

ss : TServiceStatus;

psTemp : PChar;

dwChkP : DWord; // check point

begin

ss.dwCurrentState := -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

// we want to start the service and query service

// status

schs := OpenService(schm, PChar(sService),

SERVICE_START or SERVICE_QUERY_STATUS);

// if successful...

if(schs > 0)then

begin

psTemp := Nil;

if(StartService( schs, 0,psTemp))then

begin

// check status

if(QueryServiceStatus(schs, ss))then

begin

while(SERVICE_RUNNING <> ss.dwCurrentState)do

begin

// dwCheckPoint contains a value that the

// service increments periodically to

// report its progress during a

// lengthy operation. Save current value

dwChkP := ss.dwCheckPoint;

// wait a bit before checking status again

// dwWaitHint is the estimated amount of

// time the calling program should wait

// before calling QueryServiceStatus()

// again. Idle events should be

// handled here...

Sleep(ss.dwWaitHint);

if not QueryServiceStatus(schs, ss) then

begin

// couldn't check status break from the

// loop

break;

end;

if ss.dwCheckPoint < dwChkP then

begin

// QueryServiceStatus didn't increment

// dwCheckPoint as it should have.

// Avoid an infinite loop by breaking

break;

end;

end;

end;

end;

// close service handle

CloseServiceHandle(schs);

end;

// close service control manager handle

CloseServiceHandle(schm);

end;

// Return TRUE if the service status is running

Result := SERVICE_RUNNING = ss.dwCurrentState;

end;

// Return TRUE if successful

function ServiceStop(sMachine,

sService : string) : boolean;

var

schm,

schs : SC_Handle;

ss : TServiceStatus;

dwChkP : DWord;

begin

// 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

// we want to stop the service and

// query service status

schs := OpenService( schm, PChar(sService),

SERVICE_STOP or SERVICE_QUERY_STATUS);

// if successful...

if schs > 0 then

begin

if ControlService(schs, SERVICE_CONTROL_STOP,

ss) then

begin

// check status

if(QueryServiceStatus(schs, ss))then

begin

while(SERVICE_STOPPED <> ss.dwCurrentState)do

begin

// dwCheckPoint contains a value that the

// service increments periodically to

// report its progress during a lengthy

// operation. Save current value

dwChkP := ss.dwCheckPoint;

// Wait a bit before checking status again.

// dwWaitHint is the estimated amount of

// time the calling program should wait

// before calling QueryServiceStatus()

// again. Idle events should be

// handled here...

Sleep(ss.dwWaitHint);

if(not QueryServiceStatus(schs,ss))then

begin

// couldn't check status

// break from the loop

break;

end;

if(ss.dwCheckPoint <

dwChkP)then

begin

// QueryServiceStatus didn't increment

// dwCheckPoint as it should have.

// Avoid an infinite loop by breaking

break;

end;

end;

end;

end;

// close service handle

CloseServiceHandle(schs);

end;

// close service control manager handle

CloseServiceHandle(schm);

end;

// return TRUE if the service status is stopped

Result := SERVICE_STOPPED = ss.dwCurrentState;

end;

end.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有