2013-05-03 80 views
0

我創建了一個ATL服務,並在測試我只是保持它被留下,而循環,永遠跑在運行(參見下面的代碼)什麼是保持ATL服務運行

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服務的例子。

如果我刪除線程代碼並直接調用方法,服務將始終處於啓動狀態。如果我刪除循環,服務只需啓動並立即停止。任何消化?

回答

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。

+0

這是正確的,沒有COM類,服務器退出從'PreMessageLoop'接收'S_FALSE'並且正確地修補它。 – 2013-05-03 16:23:10