使用C ++中的StartService启动服务应用程序

时间:2015-07-23 11:38:38

标签: c++ visual-studio windows-services system-error

我使用windows serviceC++中创建了Visual Studio 2013个应用。在main()函数中,调用其正文包含以下代码的另一个函数::

SERVICE_TABLE_ENTRY SerTable[] =
    {
        { const_cast<char *>(ServiceName.c_str()), (LPSERVICE_MAIN_FUNCTION)ServiceMain },
        { NULL, NULL }
    };
    int res = StartServiceCtrlDispatcher(SerTable);
    if (res == 0)
    {
        DEBUG_LOG(ServiceName+":StartServiceCtrlDispatcher failed", GetLastError());
        return QERROR;
    }

我的main()函数还包含system("start notepad");

我可以成功构建程序并生成可执行文件。现在我尝试使用OpenSCManager()CreateService()从另一个程序打开此exe。这样,服务就会创建并列在Services.msc下。我右键单击并启动了该服务,并将status显示为started。但没有任何事情发生..

现在,如果我双击exe,它会显示消息:error 1063: StartServiceControldispatcher Failed,然后打开记事本。

为什么在Services.msc下启动服务时打开记事本?

1 个答案:

答案 0 :(得分:1)

您必须从ServiceMain而不是main启动记事本。 ServiceMain是操作系统启动服务时调用的函数,因此请将system("start notepad")电话移至ServiceMain

更多澄清

作为对OP评论的回应 - 现在发生的错误是1063或ERROR_FAILED_SERVICE_CONTROLLER_CONNECTStartServiceCtrlDispatcher的文档解释了:

  

如果程序作为控制台应用程序而非作为服务运行,则会返回此错误。

这就是为什么在双击启动可执行文件时出现错误的原因 - 您将其作为控制台应用程序启动。当您正确启动服务时(从控制面板,命令提示符或WinAPI),此功能将成功。

  

当服务控制管理器启动服务进程时,它等待进程调用StartServiceCtrlDispatcher函数。服务进程的主线程应该在启动后(30秒内)尽快进行此调用。如果StartServiceCtrlDispatcher成功,它将调用线程连接到服务控制管理器,并且直到进程中的所有正在运行的服务都进入SERVICE_STOPPED状态才返回。服务控制管理器使用此连接将控制和服务启动请求发送到服务进程的主线程。主线程通过调用适当的HandlerEx函数来处理控制请求,或者通过创建新线程来在启动新服务时执行适当的ServiceMain函数来充当调度程序。

所以是的,在正确发布后,将调用ServiceMain