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

   编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册,否则会导致服务启动失败。因近期写个服务,其中遇到一些有问题,有部分内容想和大家分享一下,请大家指正。
        windows服务一般框架代码如下:

#include
#include

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

你可能感兴趣的:(使用C语言编写windows服务一般框架)