0

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

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

4

2 回答 2

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。

于 2013-05-03T11:55:56.117 回答
0

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

在这里查看更多...

于 2019-07-08T03:18:40.260 回答