您的位置:首页 > 编程语言 > C语言/C++

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

2014-12-16 08:11 447 查看
原文:
使用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所在全路径。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: