【问题标题】:What is the best way to keep a ATL service running保持 ATL 服务运行的最佳方法是什么
【发布时间】:2013-04-27 17:13:07
【问题描述】:

我创建了一个 ATL 服务,在测试时我只是通过留下一个永远运行的 while 循环来保持它运行(参见下面的代码)

HRESULT Run(_In_ int nShowCmd = SW_HIDE)
{
    m_running = true;
    HANDLE thread = (HANDLE)_beginthreadex(NULL, 0, &MyFunctionToRunInTheService, 0, 0, 0);
    while(m_running);
    return CAtlServiceModuleT::Run(nShowCmd);
}

我现在已经准备好将它作为一个真正的服务运行,但我不确定我该怎么做?我翻遍了下一个,似乎找不到 ATL 服务的一个示例。

如果我删除线程代码并直接调用该方法,则服务始终处于启动状态。如果我删除循环,服务会立即启动和停止。有什么建议吗?

【问题讨论】:

    标签: c++ windows windows-services atl


    【解决方案1】:

    我已经通过将代码更改为解决了问题

    HRESULT Run(_In_ int nShowCmd = SW_HIDE)
    {
        _beginthreadex(NULL, 0, &CheckForExpiredFiles, 0, 0, 0);
        return CAtlServiceModuleT::Run(nShowCmd);
    }
    

    我根本不需要 while 循环。在进一步调查中,保持服务活动的代码是标准的。问题是 atlbase.h 中的 PreMessageLoop 方法返回 S_FALSE 导致服务停止。在我的情况下它返回 S_FALSE 的原因是因为我没有添加任何 COM 对象。因此,在这种情况下,我重写了 PreMessageLoop 方法以返回 S_OK。

    【讨论】:

    • 这是正确的,没有 COM 类服务器退出从PreMessageLoop 接收S_FALSE 并且你正确地修补了它。
    【解决方案2】:

    好吧,就我而言,将 _ATL_NO_COM_SUPPORT 宏添加到 C\C++ 预处理器即可解决问题。

    See more here...

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2018-07-21
      • 1970-01-01
      • 2020-01-05
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2010-10-11
      相关资源
      最近更新 更多