编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册,否则会导致服务启动失败。因近期写个服务,其中遇到一些有问题,有部分内容想和大家分享一下,请大家指正。
windows服务一般框架代码如下:
#include <Windows.h>
#include <tchar.h>VOID WINAPI ServiceHandler(DWORD dwControl)
{
switch (dwControl)
{
case SERVICE_CONTROL_STOP:
{
ExitProcess(0);
}
break;
}
}
DWORD WINAPI ThreadFunc(PVOID pv)
{
Sleep(2*1000);
return TerminateProcess(GetCurrentProcess(),1);
}
VOID WINAPI ServiceMain(DWORD dwNumServicesArgs,PSTR *ppcServiceArgVectors)
{
SERVICE_STATUS_HANDLE hService = NULL;
//如果下面不初始化,导致service manager无法收到消息
SERVICE_STATUS SrvStatus = {0};
OutputDebugStringA("service main.....");
hService= RegisterServiceCtrlHandlerA("winservice",ServiceHandler);
SrvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
SrvStatus.dwCurrentState= SERVICE_RUNNING;
//服务接受停止的控制,如果你不想让别人停止你的服务,下面这行代码可以删除
SrvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
SetServiceStatus(hService,&SrvStatus);
//这句话也很重要,我刚开始就是没这句话,导致服务不能启动
CreateThread(0,0,ThreadFunc,0,0,0);//线程只是一个示例,2S后,服务启动后自动退出
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
SERVICE_TABLE_ENTRYA scArrTable[] =
{
{"winservice",ServiceMain},
{NULL,NULL}
};
StartServiceCtrlDispatcherA(scArrTable);
return 0;
}
以上实例,仅供参考。
大家可以将编译后的exe使用如下命令行进行服务的注册:
sc create "windowsservice" binPath= "windowssrv.exe" //“binPath=”这个等于符号后有个空格,否则无法注册服务,请将windowssrv.exe改为你自己EXE所在全路径。