如何编写windows服务程序(二)

2014-11-24 00:04:17 · 作者: · 浏览: 68
START_PENDING;

servicestatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;//在本例中只接受系统关机和停止服务两种控制命令

servicestatus.dwWin32ExitCode = 0;

servicestatus.dwServiceSpecificExitCode = 0;

servicestatus.dwCheckPoint = 0;

servicestatus.dwWaitHint = 0;

hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);

if (hstatus==0)

{

WriteToLog("RegisterServiceCtrlHandler failed");

return;

}

WriteToLog("RegisterServiceCtrlHandler success");

//向SCM 报告运行状态

servicestatus.dwCurrentState = SERVICE_RUNNING;

SetServiceStatus (hstatus, &servicestatus);

//下面就开始任务循环了,你可以添加你自己希望服务做的工作

brun=true;

MEMORYSTATUS memstatus;

char str[100];

memset(str,'\0',100);

while (brun)

{

GlobalMemoryStatus(&memstatus);

int availmb=memstatus.dwAvailPhys/1024/1024;

sprintf_s(str,100,"available memory is %dMB",availmb);

WriteToLog(str);

Sleep(SLEEP_TIME);

}

WriteToLog("service stopped");

}

void WINAPI CtrlHandler(DWORD request)

{

switch (request)

{

case SERVICE_CONTROL_STOP:

brun=false;

servicestatus.dwCurrentState = SERVICE_STOPPED;

break;

case SERVICE_CONTROL_SHUTDOWN:

brun=false;

servicestatus.dwCurrentState = SERVICE_STOPPED;

break;

default:

break;

}

SetServiceStatus (hstatus, &servicestatus);

}

void main()

{

SERVICE_TABLE_ENTRY entrytable[2];

entrytable[0].lpServiceName="testservice";

entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;

entrytable[1].lpServiceName=NULL;

entrytable[1].lpServiceProc=NULL;

StartServiceCtrlDispatcher(entrytable);

}

如何安装服务:

运行命令提示符cmd.exe

输入sc create testservicename binpath= D:\test.exe

输入sc start testservicename 启动服务

输入sc query 会在最底部显示你的服务当前的状态

输入sc stop testservicename 停止服务

输入sc delete testservicename删除服务,该服务将在下次重启后删除,在重启之前将不能注册同一个名字的服务。

张鹏

HikVision

Zhangpeng_nj@163.com

2011/11/22