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