首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ Windows 服務程序編譯鏈接錯誤:入口點與函數實現缺失排查

     編輯:程式設計綜合問答

錯誤 1:`DispatchTable` 中 `MyServiceMain` 未解析 — **函數聲明了但未定義實現**。

錯誤 2:`unresolved external symbol _WinMain` — **項目類型設置為 Windows 應用程序 (`/SUBSYSTEM:WINDOWS`)**,鏈接器尋找 `WinMain` 入口,但服務程序入口是 `main` (控制台) 或 `ServiceMain` (服務控制器啟動)。

修正步驟

  1. 補全服務主函數實現:
    void WINAPI MyServiceMain(DWORD argc, LPTSTR *argv) {
        // 註冊控制處理器
        g_hStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, MyServiceCtrlHandler);
        // 設置狀態 START_PENDING → RUNNING
        // 創建工作線程、事件循環
    }
    void WINAPI MyServiceCtrlHandler(DWORD ctrlCode) {
        // 處理 STOP/PAUSE/CONTINUE/INTERROGATE
    }
    
  2. 項目屬性 → 鏈接器 → 系統 → 子系統:改為 **控制台 (`/SUBSYSTEM:CONSOLE`)**,保留 `main()` 入口 (服務控制器不調用 `WinMain`),或設置 **自定義入口點** 為 `main`。
  3. 服務安裝/啟動:`sc create MyService binPath= "C:\Path\MyService.exe"` → `sc start MyService`,調試時直接在命令行運行 exe (進入 `main` → `StartServiceCtrlDispatcher`)。

完整最小服務框架

#include 
SERVICE_STATUS_HANDLE g_hStatusHandle;
void WINAPI CtrlHandler(DWORD ctrl) { /* 更新狀態 SetServiceStatus */ }
void WINAPI SvcMain(DWORD argc, LPTSTR *argv) {
    g_hStatusHandle = RegisterServiceCtrlHandler(TEXT("MySvc"), CtrlHandler);
    SetServiceStatus(g_hStatusHandle, &(SERVICE_STATUS){SERVICE_RUNNING});
    HANDLE hStop = CreateEvent(NULL, TRUE, FALSE, NULL);
    WaitForSingleObject(hStop, INFINITE); // 工作循環
    SetServiceStatus(g_hStatusHandle, &(SERVICE_STATUS){SERVICE_STOPPED});
}
int main() {
    SERVICE_TABLE_ENTRY dispatch[] = {
        {TEXT("MySvc"), SvcMain}, {NULL, NULL}
    };
    StartServiceCtrlDispatcher(dispatch); // 由 SCM 調用 SvcMain
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved