File → New → Projects → ATL COM AppWizard → Service (EXE) → `TestSvc`。編譯得 `TestSvc.exe`。
void CServiceModule::Run() {
dwThreadID = GetCurrentThreadId();
LogEvent(_T("Service started"));
if (m_bService) SetServiceStatus(SERVICE_RUNNING);
MSG msg;
while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
}
BOOL CMfc1App::InitInstance() {
_Module.Init(ObjectMap, m_hInstance, IDS_SERVICENAME, NULL);
_Module.m_bService = TRUE;
_Module.Start(); // 進入服務訊息迴圈,不再建立對話框
return FALSE; // 服務模式不返回 TRUE
}
void CServiceModule::Run() {
// ... 前述代碼 ...
// 服務啟動後建立並顯示主對話框 (需在訊息迴圈前)
if (m_bService) {
CMfc1Dlg dlg; m_pMainWnd = &dlg;
dlg.DoModal(); // 或 Create + ShowWindow
}
// 訊息迴圈 ...
}
void CMfc1Dlg::OnBtnInstall() { _Module.Install(); }
void CMfc1Dlg::OnBtnUninstall() { _Module.Uninstall(); }
// CServiceModule::Install() 中
SC_HANDLE hSvc = CreateService(hSCM, szName, szName, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, // ★關鍵
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
szPath, NULL, NULL, _T("RPCSS"), NULL, NULL);