0

我在using中创建了一个windows service应用程序。在函数中,调用另一个函数,其主体包含以下代码:C++Visual Studio 2013main()

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(), 和. 从另一个程序打开这个 exe CreateService()。通过这种方式,服务被创建并列在下面Services.msc。我右键单击并启动了该服务,它显示statusstarted. 但是什么也没发生。。

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

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

4

1 回答 1

1

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

更多说明

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

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

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

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

所以是的,在正确启动后,ServiceMain将被调用。

于 2015-07-23T12:16:38.803 回答