我已经创建了一个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?
答案 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 ++预处理程序即可解决此问题。