使用C语言编写windows服务一般框架

时间:2024-01-18 10:32:32

原文:使用C语言编写windows服务一般框架

编写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所在全路径。