首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

無 COM 接口的 ATL Windows 服務啟動失敗:_ATL_NO_COM_SUPPORT 宏解決

     編輯:關於.NET

現象

VS 模板生成的 ATL 服務專案,Debug/Release 版均通過 Service.exe -Service 註冊後,服務管理器啟動報錯:「服務無法啟動」。事件查看器無異常。Debug 版通過 RegServer 註冊後運行即退出。

根因深度追踪

  1. 服務入口 _tWinMain → Run() → PreMessageLoop()
  2. PreMessageLoop 返回 S_FALSE → RunMessageLoop() 不執行 → 進程立即退出
  3. PreMessageLoop 內部調用 RegisterClassObjects(CLSCTX_LOCAL_SERVER, ...)
  4. 該函數嘗試註冊 COM 類對象,但專案無任何 COM 接口/類 → 返回 S_FALSE

解決方案:定義 _ATL_NO_COM_SUPPORT

ATL 內部通過此宏判斷是否跳過 COM 註冊:


// 方式一:stdafx.h 或專案屬性 預處理器定義
#define _ATL_NO_COM_SUPPORT

// 方式二:專案屬性 → C/C++ → Preprocessor → Preprocessor Definitions 添加
_ATL_NO_COM_SUPPORT

預處理器定義設置

原理

定義後 PreMessageLoop 跳過 RegisterClassObjects,直接返回 S_OK,服務正常進入消息循環。

適用場景

  • 純業務邏輯服務(定時任務、Socket監聽、文件監控)
  • 無需對外暴露 COM 對象、無 ActiveX/Automation 需求
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved