LPSERVICE_MAIN_FUNCTIONA回调函数 (winsvc.h)
服务的入口点。
LPSERVICE_MAIN_FUNCTION 类型定义指向此回调函数的指针。 ServiceMain 是应用程序定义的函数名称的占位符。
语法
LPSERVICE_MAIN_FUNCTIONA LpserviceMainFunctiona;
void LpserviceMainFunctiona(
[in] DWORD dwNumServicesArgs,
[in] LPSTR *lpServiceArgVectors
)
{...}
参数
[in] dwNumServicesArgs
lpServiceArgVectors 数组中的参数数。
[in] lpServiceArgVectors
通过调用启动服务的 StartService 函数传递给服务的 null 终止参数字符串。 如果没有参数,此参数可以为 NULL。 否则,第一个参数(lpServiceArgVectors[0])是服务的名称,后跟任何其他参数(lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServicesArgs-1])。
如果用户从控制面板使用服务管理单元启动手动服务,则 lpServiceArgVectors 参数的字符串来自服务的属性对话框(从服务管理单元中,右键单击服务条目,单击 属性,并在 Start 参数中输入参数。
返回值
没有
言论
服务程序可以启动一个或多个服务。 服务进程具有可以启动的每个服务的 SERVICE_TABLE_ENTRY 结构。 该结构指定服务名称和指向该服务的 ServiceMain 函数的指针。
当服务控制管理器收到启动服务的请求时,它会启动服务进程(如果尚未运行)。 服务进程的主线程调用 StartServiceCtrlDispatcher 函数,该函数具有指向 SERVICE_TABLE_ENTRY 结构的数组的指针。 然后,服务控制管理器将启动请求发送到此服务进程的服务控制调度程序。 服务控制调度程序创建一个新线程,用于执行正在启动的服务的 ServiceMain 函数。
ServiceMain 函数应立即调用 RegisterServiceCtrlHandlerEx 函数,以指定 HandlerEx 函数来处理控制请求。 接下来,它应调用 SetServiceStatus 函数将状态信息发送到服务控制管理器。 这些调用后,该函数应完成服务的初始化。 请勿尝试在 ServiceMain 函数中启动另一个服务。
服务控制管理器(SCM)等待服务报告SERVICE_RUNNING状态。 建议服务尽快报告此状态,因为系统中需要与 SCM 交互的其他组件在此期间将被阻止。 某些函数可能需要直接或间接地与 SCM 交互。
SCM 在初始化期间锁定服务控制数据库,因此,如果服务尝试在初始化期间调用 StartService,调用将阻止。 当服务向 SCM 报告已成功启动时,它可以调用 StartService。 如果服务需要运行另一个服务,该服务应设置所需的依赖项。
此外,在服务初始化期间,不应调用任何系统函数。 仅当服务代码报告SERVICE_RUNNING状态后,服务代码才应调用系统函数。
ServiceMain 函数应创建全局事件,对此事件调用 RegisterWaitForSingleObject 函数,然后退出。 这会终止运行 ServiceMain 函数的线程,但不会终止服务。 服务停止时,服务控制处理程序应使用SERVICE_STOP_PENDING调用 SetServiceStatus 并发出此事件信号。 线程池中的线程将执行等待回调函数;此函数应执行清理任务,包括关闭全局事件,并使用 SERVICE_STOPPED 调用 SetServiceStatus。 服务停止后,不应执行任何其他服务代码,因为如果服务收到启动控件并再次调用 serviceMain,则可以引入争用条件。 请注意,当多个服务共享进程时,此问题更有可能发生。
例子
有关示例,请参阅 编写 ServiceMain 函数。
注意
winsvc.h 标头将LPSERVICE_MAIN_FUNCTION定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP [仅限桌面应用] |
支持的最低服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | winsvc.h (包括 Windows.h) |