windows下用C语言实现服务程序编写与安装

说是每学点知识就记录下,前段时间也没弄,还是自己懒惰了,今天逼着自己写写,当是在复习下,废话少说,进入正题。

windows的服务程序 需要SERVICE_TABLE_ENTRY这个结构体(描述服务名和对应启动的函数eg:ServiceMain),然后StartServiceCtrlDispatcher来调用前面的结构体,在ServiceMain函数里要注册服务状态控制的方法,不然就不能控制服务的初始化、启动等,这个是基本的服务程序

主要代码如下(只有服务程序,下面会有解说安装、卸载等):

 1 //定义全局的服务状态
 2 static SERVICE_STATUS ServerStatus = {0};
 3 //ServiceName就是服务名字,ServiceMain就是服务名对应的执行方法,有什么要执行的就加入到这个函数里面
 4 int main(int argc, char *argv[]){
 5 SERVICE_TABLE_ENTRY ServerEntry[] = {{(LPSTR)ServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, {NULL, NULL}};
 6 StartServiceCtrlDispatcherA(ServerEntry);
 7 }
 8
 9 void WINAPI ServiceMain()
10 {
11 //初始化服务配置
12 ServerStatus.dwServiceType =        SERVICE_WIN32_OWN_PROCESS;
13     ServerStatus.dwCurrentState =        SERVICE_RUNNING;
14     ServerStatus.dwControlsAccepted =    SERVICE_ACCEPT_STOP;
15     ServerStatus.dwWin32ExitCode =        S_OK;
16     ServerStatus.dwServiceSpecificExitCode = 0;
17     ServerStatus.dwCheckPoint =            0;
18     ServerStatus.dwWaitHint =            0;
19 //注册控制
20     ServiceStatusHwnd = RegisterServiceCtrlHandler(ServiceName, ServiceStrl);
21
22 //默认设置服务为启动状态SERVICE_RUNNING
23     SetServiceStatus(ServiceStatusHwnd, &ServerStatus);
24
25 //在这执行自己的代码,如果要保持服务要一直运行,记得在下面阻塞不让执行下面的停止命令,如果不加下面的服务停止,也不加阻塞,服务就报异常的
26
27
28 ServerStatus.dwCurrentState = SERVICE_STOPPED;
29     SetServiceStatus (ServiceStatusHwnd, &ServerStatus);
30 }
31
32 //控制服务
33 void WINAPI ServiceStrl(DWORD dwOpcode)
34 {
35     switch (dwOpcode)
36     {
37     case SERVICE_CONTROL_STOP:
38         break;
39     case SERVICE_CONTROL_SHUTDOWN:
40         break;
41     }
42 }

差不多就这个一个服务程序就好了,下面就是安装服务等:

 1 //安装服务封装了个简单的方法,传入服务程序的路劲即可
 2 BOOLEAN Install(PCHAR szFilePath)
 3 {
 4     //打开服务控制管理器
 5     SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 6     if (hSCM == NULL)
 7     {
 8         LogEvent(TEXT("Couldn‘t open service manager"));
 9         return FALSE;
10     }
11
12     //创建服务
13     SC_HANDLE hService = CreateService(
14         hSCM, ServiceName, ServiceName,
15         SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
16         SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
17         szFilePath, NULL, NULL, TEXT(""), NULL, NULL);
18
19     if (hService == NULL)
20     {
21         CloseServiceHandle(hSCM);
22         LogEvent(TEXT("Couldn‘t create service"));
23         return FALSE;
24     }
25
26     //改变服务描述
27     SERVICE_DESCRIPTION Description;
28     TCHAR szDescription[1024];
29     ZeroMemory(szDescription, 1024);
30     ZeroMemory(&Description,sizeof(SERVICE_DESCRIPTION));
31     lstrcpy(szDescription, TEXT("服务端控制程序描述."));
32     Description.lpDescription = szDescription;
33     ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &Description);
34
35     //开始服务
36     StartService(hService,0,NULL);
37
38     CloseServiceHandle(hService);
39     CloseServiceHandle(hSCM);
40     return TRUE;
41 }
42 //服务的卸载(先停止服务,在删除服务)
43 BOOLEAN Uninstall()
44 {
45     SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
46
47     if (hSCM == NULL)
48     {
49         LogEvent(TEXT("Couldn‘t open service manager"));
50         return FALSE;
51     }
52
53     SC_HANDLE hService = OpenService(hSCM, ServiceName, SERVICE_STOP | DELETE);
54
55     if (hService == NULL)
56     {
57         CloseServiceHandle(hSCM);
58         LogEvent(TEXT("Couldn‘t open service"));
59         return FALSE;
60     }
61     SERVICE_STATUS status;
62     ControlService(hService, SERVICE_CONTROL_STOP, &status);
63
64     //删除服务
65     BOOLEAN bDelete = DeleteService(hService);
66     CloseServiceHandle(hService);
67     CloseServiceHandle(hSCM);
68
69     if (bDelete)
70     {
71         return TRUE;
72     }
73
74     LogEvent(TEXT("Service could not be deleted"));
75     return FALSE;
76 }
时间: 2024-08-26 21:57:05

windows下用C语言实现服务程序编写与安装的相关文章

Windows下搭建go语言开发环境 以及 开发IDE (附下载链接)

1.下载 并且 安装 Go安装包 =========================================================== 在CSDN上传了我的版本,供大家下载: =========================================================== go1.2.windows-386.msi : http://download.csdn.net/detail/shuideyidi/7718563 go1.2.1.windows-am

Windows下用C语言连接Mysql注意问题

原文:Windows下用C语言连接Mysql注意问题 环境是:在VS6.0 安装Mysql后,我们需要相应的头文件以及lib文件,所以安装过程必须是完整安装.否则不会生成include文件夹哦~ 具体步骤如下: 1.完全安装mysql,这样才能生成include文件夹. 2.在Directories的标 签页中右边的"Show directories for" 下拉列表中选中"Includefiles", 然后在中间列表框中添加你本地安装MySQL的include目

在windows下用C语言写socket通讯实例

原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link with Ws2

windows下的go语言的环境搭建和初探

闲话不说,直入主题. 1.准备工具 a.windows下的Go语言开发安装包 官方下载地址:https://code.google.com/p/go/downloads/list b.Go语言中文官网(有相关参考和文档) http://zh.golanger.com/ 2.方法步骤 在Go语言的Google代码项目上下载Windows下的Go语言开发包(下载地址见工具).有zip压缩版和msi安装版两个按本下载.(这里使用msi安装版,比较方便)   下载得到一个msi安装文件,运行它.一路Ne

windows下制作linux U盘启动盘或者安装优盘(转)

windows下制作linux U盘启动盘或者安装优盘(转) Linux发行版排行榜:http://iso.linuxquestions.org/ [方案一]:UltraISO(不推荐,在Windows下制作Windows安装盘绝佳) 用UltraISO软件打开linux发行版的ISO文件,用UltraISO软件的“启动/启动光盘”中的:写入硬盘映像,选择USB-HDD/USB-HDD+,点击写入. [方案二]:UNetbootin(中文界面) http://unetbootin.sourcef

Windows下学习C语言有哪些集成开发软件?

前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢探究.想到大多数小伙伴都是使用Windows系统,今天就先说下Windows系统下有哪些学习C语言的集成开发环境,由于篇幅问题,具体安装方法之后再详细分解. 什么是集成开发工具(IDE) 这里大家如果没有接触过编程的话,可能不知道什么是集成开发环境. 之前已经说过编程的核心工具是下边几个:编辑器:

Windows下使用C语言实现2048

这是我之前写的一个小游戏,在windows下的Dev-C++中用C语言来实现的,通过不断的清屏,打印,清屏,打印来实现动态效果,不过功能不完善,有几个缺陷的地方. 实现效果(使用 w a s d 四个键来控制上下左右的移动) : 源代码(如果在Dev-C++中编译运行的时候报错,请将注释符号   //    换为  /**/ 来进行注释): #include <stdio.h> #include <stdlib.h> // for rand() and srand() and ex

Python科学计算(二)windows下开发环境搭建(当用pip安装出现Unable to find vcvarsall.bat)

用于科学计算Python语言真的是amazing! 方法一:直接安装集成好的软件 刚开始使用numpy.scipy这些模块的时候,图个方便直接使用了一个叫做Enthought的软件.Enthought是一家位于美国得克萨斯州首府奥斯汀的软件公司,主要使用Python从事科学计算工具的开发.Enthought里面包含了很多库,不需要你自己安装就可以直接使用了. 其实还又很多Python科学计算的集成软件,比如Python(x, y)和WinPython,个人感觉WinPython还是不错的,里面包

Windows下用Putty管理VMware Workstation 虚拟机中安装的Ubuntu12.04 LTS

Windows下实现用Putty登录管理VMware Workstation 虚拟机中安装的Ubuntu12.04 LTS 1.下载putty软件:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html,下载putty.exe,该软件不许安装,下载后直接可以运行: 2.查看Ubuntu12.04 IP地址:在VMware Workstation 虚拟机中的Ubuntu12.04 LTS上使用ctrl+alt+t 快捷键开启一