Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保持ATL服务运行的最佳方式是什么_C++_Windows_Windows Services_Atl - Fatal编程技术网

C++ 保持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

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

我现在已经准备好把它作为一个真正的服务来运行了,但是我不知道我该怎么做?我看了下一篇文章,似乎找不到一个ATL服务的例子


如果我删除线程代码并调用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);
}