Share via


已定義_ATL_NO_COM_SUPPORT ATL 服務將不會啟動

本文可協助您解決在建立預設 ATL 服務項目之後,使用中範本連結庫 (ATL) 專案精靈不會以服務方式啟動的問題。

原始產品版本: Visual Studio 2010
原始 KB 編號: 2480736

徵狀

使用 ATL 專案精靈建立預設 ATL 服務項目之後,您可以使用命令行參數註冊服務 /Service ,然後嘗試使用 net start啟動服務。 服務會啟動,然後立即結束並顯示下列訊息:

無法啟動服務

c:\>net start ATLService
The ATLService service is starting........
The ATLService service could not be started.

The service did not report an error.

原因

如果沒有 ATL 元件物件模型 (COM) 服務中實作的物件,ATL 服務基類庫就不會呼叫 Win32 方法 SetServiceStatus (SERVICE_RUNNING) 。

解決方案

ATL 服務主要是設計為 COM 物件的服務主機,因此預期開發人員會將 COM 物件新增至服務。

不過,您可以在沒有 COM 的情況下使用 ATL。 例如,有一個宏,您可以定義哪一個 _ATL_NO_COM_SUPPORT 宏會關閉在 ATL 連結庫中註冊和實作 COM 物件的大部分支援。

由於服務基類中的錯誤,如果 _ATL_NO_COM_SUPPORT 已定義, SetServiceStatus 則不會進行 (SERVICE_RUNNING) 呼叫,而且服務將會啟動,然後立即結束。

您可以覆寫 PreMessageLoop 衍生類別中的 CAtlServiceModule 函式並呼叫 SetServiceStatus,以解決此 Bug:

HRESULT PreMessageLoop(int nShowCmd)
{
    SetServiceStatus(SERVICE_RUNNING);
    return __super::PreMessageLoop(nShowCmd);
}

注意事項

PreMessageLoop 覆寫只與已 _ATL_NO_COM_SUPPORT 定義的 ATL 服務相關。

其他相關資訊

  1. 使用專案精靈建立新的ATL專案。

  2. 將專案命名為 ATLService ,然後在 [ 應用程式設定] 中選取 [服務 ] 選項。

  3. 開啟 stdafx.h 檔案,並在任何標頭語 #include 句之前定義 _ATL_NO_COM_SUPPORT

    #define _ATL_NO_COM_SUPPORT
    
  4. 建置專案。

  5. 從主控台視窗註冊服務:

    ATLService /service  
    
  6. 啟動服務:

    c:\>net start ATLService
    The ATLService service is starting.
    The ATLService service could not be started.
    
    The service did not report an error.
    
  7. 新增因應程式代碼並重建服務。 您可能也需要重新註冊服務。

  8. 再次啟動服務:

    c:\>net start ATLService
    The ATLService service is starting.
    The ATLService service was started successfully.