background image

    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。这将把调用进程的主线程转换为控制分派器。该