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 结
构之中。它有两个域:
lpServiceName: 指向表示服务名称字符串的指针;当定义了多个服务时,那么这个域必须
指定;
lpServiceProc: 指向服务主函数的指针(服务入口点);
分派表的最后一项必须是服务名和服务主函数域的
NULL 指针,文本例子程序中只宿
主一个服务,所以服务名的定义是可选的。
服务控制管理器(
SCM:Services Control Manager)是一个管理系统所有服务的进程。
当
SCM 启动某个服务时,它等待某个进程的主线程来调用 StartServiceCtrlDispatcher 函数。
将分派表传递给
StartServiceCtrlDispatcher。这将把调用进程的主线程转换为控制分派器。该