C++ 保持ATL服务运行的最佳方式是什么
我已经创建了一个ATL服务,在测试时,我只是通过留下一个永远运行的while循环来保持它的运行(参见下面的代码) 我现在已经准备好把它作为一个真正的服务来运行了,但是我不知道我该怎么做?我看了下一篇文章,似乎找不到一个ATL服务的例子C++ 保持ATL服务运行的最佳方式是什么,c++,windows,windows-services,atl,C++,Windows,Windows Services,Atl,我已经创建了一个ATL服务,在测试时,我只是通过留下一个永远运行的while循环来保持它的运行(参见下面的代码) 我现在已经准备好把它作为一个真正的服务来运行了,但是我不知道我该怎么做?我看了下一篇文章,似乎找不到一个ATL服务的例子 如果我删除线程代码并调用direct方法,服务将始终处于启动状态。如果我移除循环,服务就会直接启动和停止。有什么建议吗?我把代码改为 HRESULT Run(_In_ int nShowCmd = SW_HIDE) { _beginthreadex(NUL
如果我删除线程代码并调用direct方法,服务将始终处于启动状态。如果我移除循环,服务就会直接启动和停止。有什么建议吗?我把代码改为
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。在我的例子中,添加_ATL_NO_COM_SUPPORT宏到C\C++预处理器以解决问题
这是正确的,没有COM类,服务器从
PreMessageLoop
接收到S_FALSE
,并且您正确地对其进行了修补。
HRESULT Run(_In_ int nShowCmd = SW_HIDE)
{
_beginthreadex(NULL, 0, &CheckForExpiredFiles, 0, 0, 0);
return CAtlServiceModuleT::Run(nShowCmd);
}