頭文件 WinServer.h
#pragma once //使用智能指針的頭文件 #include <memory> //服務程序入口頭文件 #include "AccountHandler_RPC.h" //既然是編寫window后台服務, 肯定要包含window頭文件 #include <Windows.h> //服務名稱 #define SERVICE_NAME L"AccoutSync" using namespace std; class WinServer { public: WinServer(); ~WinServer(); bool StartServer(); private: static void WINAPI RegisterServer(int argc, char** argv); static void WINAPI ServiceHandler(DWORD fdwControl); static DWORD WINAPI SerWorkThread(LPVOID para); private: SERVICE_TABLE_ENTRY m_SerTable[2]; SERVICE_STATUS m_SerStatus; SERVICE_STATUS_HANDLE m_hSerStatusHandle; HANDLE m_SerHandle; shared_ptr<AccountHandler_RPC> m_AccSyncHandle; };
源文件
#include "WinServer.h" #include <stdio.h> #pragma warning(disable:4996) static WinServer* g_glpbalObj; WinServer::WinServer() { m_AccSyncHandle = make_shared<AccountHandler_RPC>(); g_glpbalObj = this; } WinServer::~WinServer() { } bool WinServer::StartServer() { m_SerTable[0].lpServiceName = SERVICE_NAME; m_SerTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)RegisterServer; m_SerTable[1].lpServiceName = NULL; m_SerTable[1].lpServiceProc = NULL; //啟動服務的控制分派機線程 if (StartServiceCtrlDispatcher(m_SerTable) == FALSE) { printf("啟動失敗....錯誤編碼: %d\n", GetLastError()); return false; } printf("服務啟動成功"); return true; } void WinServer::RegisterServer(int argc, char** argv) { g_glpbalObj->m_SerStatus.dwServiceType = SERVICE_WIN32; g_glpbalObj->m_SerStatus.dwCurrentState = SERVICE_START_PENDING; g_glpbalObj->m_SerStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; g_glpbalObj->m_SerStatus.dwWin32ExitCode = 0; g_glpbalObj->m_SerStatus.dwServiceSpecificExitCode = 0; g_glpbalObj->m_SerStatus.dwCheckPoint = 0; g_glpbalObj->m_SerStatus.dwWaitHint = 0; g_glpbalObj->m_hSerStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceHandler); if (g_glpbalObj->m_hSerStatusHandle == 0) { DWORD nError = GetLastError(); } //服務線程入口 g_glpbalObj->m_AccSyncHandle->StartThread(); g_glpbalObj->m_SerHandle = CreateThread(NULL, NULL, SerWorkThread, NULL, 0, 0); if (g_glpbalObj->m_SerHandle == INVALID_HANDLE_VALUE) { DWORD nError = GetLastError(); return; } // 初始化完成, 記錄服務運行狀態 g_glpbalObj->m_SerStatus.dwCurrentState = SERVICE_RUNNING; g_glpbalObj->m_SerStatus.dwCheckPoint = 0; g_glpbalObj->m_SerStatus.dwWaitHint = 9000; if (!SetServiceStatus(g_glpbalObj->m_hSerStatusHandle, &g_glpbalObj->m_SerStatus)) { DWORD nError = GetLastError(); } } DWORD WinServer::SerWorkThread(LPVOID para) { while (true) { Sleep(100); } return 0; } void WinServer::ServiceHandler(DWORD fdwControl) { switch (fdwControl) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: g_glpbalObj->m_SerStatus.dwWin32ExitCode = 0; g_glpbalObj->m_SerStatus.dwCurrentState = SERVICE_STOPPED; g_glpbalObj->m_SerStatus.dwCheckPoint = 0; g_glpbalObj->m_SerStatus.dwWaitHint = 0; //退出服務代碼 //g_glpbalObj->m_SerProcessPtr->UnInit(); break; default: return; }; if (!SetServiceStatus(g_glpbalObj->m_hSerStatusHandle, &g_glpbalObj->m_SerStatus)) { DWORD nError = GetLastError(); } }
main函數調用
#include "winServer.h" #define SERVICES int main() { #ifdef SERVICES WinServer service; service.StartServer(); #else AccountHandler_RPC AccHandle; AccHandle.StartThread();
return 0; }
在window上面安裝服務
方法1:
使用sc(server command)命令安裝后台服務
1: 創建后台服務
sc create 服務名稱 binPath= "exe程序路徑"(備注: =號后面一定要有一個空格, 不然服務創建失敗)
2: 啟動后台服務
sc start 服務名稱
方法2: 使用創建window服務小工具(上傳不了, 需要的郵箱留言, 單獨發送)