保持ATL服务运行的最佳方法是什么

时间:2013-05-03 10:15:32

标签: c++ windows windows-services atl

我已经创建了一个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服务的例子。

如果我删除线程代码并直接调用方法,则服务始终处于启动状态。如果我删除循环,服务只是启动并立即停止。任何sugestions?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

好吧,在我的案例中,将_ATL_NO_COM_SUPPORT宏添加到C \ C ++预处理程序即可解决此问题。

See more here...