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 参数的字符串来自“服务”管理单元中服务 (的属性对话框,右键单击服务条目,单击“属性”,然后在“启动参数”中输入参数。)
返回值
无
备注
服务程序可以启动一个或多个服务。 服务进程对于它可以启动的每个服务都有 一个SERVICE_TABLE_ENTRY 结构。 结构指定服务名称和指向该服务的 ServiceMain 函数的指针。
当服务控制管理器收到启动服务的请求时,它会启动服务进程 ((如果尚未运行) )。 服务进程的main线程使用指向SERVICE_TABLE_ENTRY结构数组的指针调用 StartServiceCtrlDispatcher 函数。 然后,服务控制管理器为此服务进程向服务控制调度程序发送启动请求。 服务控制调度程序创建一个新线程,用于执行所启动服务的 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 [仅限桌面应用] |
目标平台 | Windows |
标头 | winsvc.h (包括 Windows.h) |