頭文件 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服務小工具(上傳不了, 需要的郵箱留言, 單獨發送)
