Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该在服务模板中的何处添加自己的代码?_C++_Windows_Service_Windows Services - Fatal编程技术网

C++ 我应该在服务模板中的何处添加自己的代码?

C++ 我应该在服务模板中的何处添加自己的代码?,c++,windows,service,windows-services,C++,Windows,Service,Windows Services,Microsoft提供了一个从编写Windows服务开始的平台。但是,我不理解以下部分: 我不理解包含return语句的无限循环的意义。这不是违背了目的吗 似乎鼓励在while循环之前编写服务内容,但是如果我们没有达到以下行: WaitForSingleObject(ghSvcStopEvent, INFINITE); 。。。当适当的事件被触发时,服务将无法停止,是吗 这个模板有缺陷吗?如何使我的服务等待外部触发器而不使其不受停止呼叫的影响?是的,该示例编写得不是特别好。服务的主循环(概念上)

Microsoft提供了一个从编写Windows服务开始的平台。但是,我不理解以下部分:

我不理解包含return语句的无限循环的意义。这不是违背了目的吗

似乎鼓励在while循环之前编写服务内容,但是如果我们没有达到以下行:

WaitForSingleObject(ghSvcStopEvent, INFINITE);
。。。当适当的事件被触发时,服务将无法停止,是吗


这个模板有缺陷吗?如何使我的服务等待外部触发器而不使其不受停止呼叫的影响?

是的,该示例编写得不是特别好。服务的主循环(概念上)编写得更好,如下所示:

在服务的控制处理程序中,您将有:

// CtrlHandler callback
DWORD WINAPI CtrlHandler (DWORD dwControl, DWORD  dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    ...
    if (dwControl == SERVICE_CONTROL_STOP)
        quit = true;
    return NO_ERROR;
}
其中,
quit
是一个全局变量

在实践中(为了避免繁忙的循环),服务可能通常坐在那里等待某种可等待的对象来做一些事情。为了便于论证,让我们设想一下,这是一个名为ghWakeupEvent的句柄,通过创建,并再次存储在全局变量中

然后,代码变成如下所示:

// Main processing loop
while (1)
{
    WaitForSingleObject (ghWakeupEvent, INFINITE);
    if (quit)
    {
        ReportSvcStatus (SERVICE_STOPPED, NO_ERROR, 0);
        return;
    }

    if (something_to_do)
        do_work ();
}

// CtrlHandler callback
DWORD WINAPI CtrlHandler (DWORD dwControl, DWORD  dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    ...
    if (dwControl == SERVICE_CONTROL_STOP)
    {
        quit = true;    // do this first!!
        SetEvent (ghWakeupEvent);
    }

    return NO_ERROR;
}

注意:无需(或指向)
ghSvcStopEvent
。MSDN示例是一团混乱。

是否有扩展到
continue
的宏或其他什么?整个源代码中没有
continue
。这正是我需要的答案!非常感谢,比微软的随机实习生更有用,他写了这个垃圾样本。@Norgannon ROFL。在这里发布了一条文档评论:@PaulSanders谢谢!我来自MSDN示例。我挠头了两天,几乎没用:)我想这个例子还是可以挽救的,但在某些地方需要重新编写。特别是在将有意义的内容/工作放入系统服务时。也许值得一提的是:
CtrlHandler
的签名是使用
LPHANDLER\u函数的
RegisterServiceCtrlHandlerEx
回调typedef(带扩展参数集)所需的签名。MSDN示例也省略了这个细节(它使用非Ex版本)。
// CtrlHandler callback
DWORD WINAPI CtrlHandler (DWORD dwControl, DWORD  dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    ...
    if (dwControl == SERVICE_CONTROL_STOP)
        quit = true;
    return NO_ERROR;
}
// Main processing loop
while (1)
{
    WaitForSingleObject (ghWakeupEvent, INFINITE);
    if (quit)
    {
        ReportSvcStatus (SERVICE_STOPPED, NO_ERROR, 0);
        return;
    }

    if (something_to_do)
        do_work ();
}

// CtrlHandler callback
DWORD WINAPI CtrlHandler (DWORD dwControl, DWORD  dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    ...
    if (dwControl == SERVICE_CONTROL_STOP)
    {
        quit = true;    // do this first!!
        SetEvent (ghWakeupEvent);
    }

    return NO_ERROR;
}