用 C 语言编写 Windows 服务程序的五个步骤
来源:互联网 发布:淘宝打假团队 编辑:程序博客网 时间:2024/05/16 11:49
用 C 语言编写 Windows 服务程序的五个步骤 下载源代码 #include <windows.h>#include <stdio.h> 接着,定义两个常量: #define SLEEP_TIME 5000#define LOGFILE "C://MyServices//memstatus.txt" SLEEP_TIME 指定两次连续查询可用内存之间的毫秒间隔。在第二步中编写服务工作循环的时候要使用该常量。 int WriteToLog(char* str){ FILE* log; log = fopen(LOGFILE, "a+"); if (log == NULL) return -1; fprintf(log, "%s/n", str); fclose(log); return 0;} 声明几个全局变量,以便在程序的多个函数之间共享它们值。此外,做一个函数的前向定义: SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE hStatus; void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); int InitService(); 现在,准备工作已经就绪,你可以开始编码了。服务程序控制台程序的一个子集。因此,开始你可以定义一个 main 函数,它是程序的入口点。对于服务程序来说,main 的代码令人惊讶地简短,因为它只创建分派表并启动控制分派机。 void main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MemoryStatus"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; // 启动服务的控制分派机线程 StartServiceCtrlDispatcher(ServiceTable); } 一个程序可能包含若干个服务。每一个服务都必须列于专门的分派表中(为此该程序定义了一个 ServiceTable 结构数组)。这个表中的每一项都要在 SERVICE_TABLE_ENTRY 结构之中。它有两个域:
分派表的最后一项必须是服务名和服务主函数域的 NULL 指针,文本例子程序中只宿主一个服务,所以服务名的定义是可选的。
调用 SetServiceStatus 函数向 SCM 报告服务的状态时。要提供 hStatus 句柄和 ServiceStatus 结构。注意 ServiceStatus 一个全局变量,所以你可以跨多个函数使用它。ServiceMain 函数中,你给结构的几个域赋值,它们在服务运行的整个过程中都保持不变,比如:dwServiceType。 // 服务初始化int InitService() { int result; result = WriteToLog("Monitoring started."); return(result); } 在 ServiceMain 中,检查 InitService 函数的返回值。如果初始化有错(因为有可能写日志文件失败),则将服务状态置为终止并退出 ServiceMain: error = InitService(); if (error) { // 初始化失败,终止服务 ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus); // 退出 ServiceMain return; } 如果初始化成功,则向 SCM 报告状态: // 向 SCM 报告运行状态 ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus (hStatus, &ServiceStatus); 接着,启动工作循环。每五秒钟查询一个可用物理内存并将结果写入日志文件。
由于 ServiceStatus 结构对于整个程序而言为全局量,ServiceStatus 中的工作循环在当前状态改变或服务终止后停止。其它的控制请求如:PAUSE 和 CONTINUE 在本文的例子没有处理。 sc create MemoryStatus binpath= c:/MyServices/MemoryStatus.exe 发出此创建命令。指定服务名和二进制文件的路径(注意 binpath= 和路径之间的那个空格)。安装成功后,便可以用服务控制面板来控制这个服务(参见图一)。用控制面板的工具栏启动和终止这个服务。 sc delete MemoryStatus 指定 “delete” 选项和服务名。此服务将被标记为删除,下次西通重启后,该服务将被完全移除。 Monitoring started.273469440273379328273133568273084416Monitoring stopped. 为了测试 MemoryStatus 服务在出错情况下的行为,可以将 memstatus.txt 文件设置成只读。这样一来,服务应该无法启动。 |
作者简介 Yevgeny Menaker 是一名有着超过5年经验开发人员,作家和 Linux 顾问。过去的三年,Yevgeny 专注于开发新的高级的 Internet 技术。他牵头编写了《Programming Perl in the .NET Environment》一书(Prentice-Hall)。此外,作为 Linux 顾问,他还在 Object Innovations 任职。Yevgeny Menaker 的联系方式是:jeka_books@hotmail.com |
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用C 语言编写 Windows 服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用 C 语言编写 Windows 服务程序的五个步骤
- Opera widget: 水族馆模拟游戏 - SimAquarium v2.3汉化版
- WinCE恢复默认HIVE注册表的方法
- java版的memcached client及使用文档
- 漫谈WinCE输入法的编写(一)
- java Date类型概述
- 用 C 语言编写 Windows 服务程序的五个步骤
- 使CxGrid实现如ListView一样的界面.
- 5个广口瓶被污染的药片,没污染的药每片10mg,被污染的每片9mg,一次称重找出被污染药瓶的问题 - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题
- 仿MFC实现c++的按名动态创建对象功能
- VC常见的108个问题
- 在一个重男轻女的国家里,每个家庭都想生男孩,如果他们生的孩子是女孩,就再生一个,直到生下的是男孩为止。这样的国家,男女比例会是多少? - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- 时钟的指针一天内会重合几次? - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- 如何在wince中建立PPPoE拨号
- 一辆学校班车里面能装多少个高尔夫球? Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题