服务如同普通的win32窗口一样,都有会有句柄,转发,以及处理等概念.只不过这些概念和win32窗口编程稍有不同,在windows服务编程里面,每个服务都有一个控制句柄,以及相应的处理函数.同样,处理函数会在控制分发函数在收到服务控制程序的控制请求时调用.
想要创建一个服务,首先需要在main函数(winmain函数)当中调用StartServiceCtrlDispatcher函数。StartServiceCtrlDispatcher函数会将一个结构体指针用于注册一个服务。结构体的定义如下:
typedef struct _SERVICE_TABLE_ENTRYW {
LPWSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
}SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
typedef VOID (WINAPI *LPSERVICE_MAIN_FUNCTIONW)(
DWORD dwNumServicesArgs,
LPWSTR *lpServiceArgVectors
);
这个结构体包含两项,第一项是服务的名称,第二项是服务的入口函数。传入到StartServiceCtrlDispatcher的指针实际上应该是一个数组的地址。因为MSDN文档要求指针的最后一项必须是0,也就是字符串名称为0,同时函数地址也为0.
static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
static WCHAR ServiceName[] = L"Themes";
static SERVICE_TAB