windows 服務編程

#include <stdio.h>
#include <windows.h>

//全局變量
SERVICE_STATUS ServiceStatus; //服務狀態
SERVICE_STATUS_HANDLE hStatus; //服務控制

//聲明
VOID WINAPI ServiceHandler(DWORD fdwControl);
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
DWORD WINAPI MyWork(LPVOID lpParam);

void main()
{
SERVICE_TABLE_ENTRY ServTable[2];//服務 SERVICE_TABLE_ENTRY 結構體

ServTable[0].lpServiceName = "MyTestService";//服務名
ServTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;//服務開始入口函數 ServiceMain()

//其後的(不需要的)數組設爲空
ServTable[1].lpServiceName = NULL;
ServTable[1].lpServiceProc = NULL;

StartServiceCtrlDispatcher(ServTable);//通知服務控制程序,服務正運行
}


//服務入口函數
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
DWORD result = 0;
DWORD specificError = 0xFFFFFFFF;

ServiceStatus.dwServiceType = SERVICE_WIN32;//服務類型win32
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;//設置服務當前狀態,SERVICE_START_PENDING 表明服務正在初始化
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;//服務接受的控制類型

//允許錯誤報告的代碼,預定義在WinError.h中
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;//服務可以通過CheckPoint 報告當前處於進程的那一步
ServiceStatus.dwWaitHint = 0;//服務到達下一步的毫秒數

//註冊服務控制句柄,函數ServiceHandler()
hStatus = RegisterServiceCtrlHandler("MyServiceName",(LPHANDLER_FUNCTION)ServiceHandler);
if(!hStatus)
return;
result = GetLastError();//檢查上述過程是否有錯誤

if(result != NO_ERROR)//有錯誤
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
ServiceStatus.dwWin32ExitCode = result;
ServiceStatus.dwServiceSpecificExitCode = specificError;

SetServiceStatus(hStatus, &ServiceStatus);
return;
}

//初始化完成,開始設置服務狀態
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

SetServiceStatus(hStatus,&ServiceStatus);//應用設置

HANDLE hThread = CreateThread(NULL,0,MyWork,NULL,0,NULL);//新建線程去執行服務,這裏是 MyWork()函數
if(hThread == NULL)
{
return;
}
}

//服務控制函數
VOID WINAPI ServiceHandler(DWORD fdwControl)
{
switch(fdwControl)//根據DWORD fdwControl,對服務狀態進行相應設置
{
case SERVICE_CONTROL_PAUSE:
{
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
}
case SERVICE_CONTROL_CONTINUE:
{
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
}
case SERVICE_CONTROL_STOP:
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
ServiceStatus.dwWin32ExitCode = 0;
SetServiceStatus(hStatus, &ServiceStatus);
break;
}
case SERVICE_CONTROL_SHUTDOWN:
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
ServiceStatus.dwWin32ExitCode = 0;
SetServiceStatus(hStatus, &ServiceStatus);
break;
}
case SERVICE_CONTROL_INTERROGATE:
{
break;
}
default:
break;
}

SetServiceStatus(hStatus,&ServiceStatus);
return;
}

//實際的服務內容
DWORD WINAPI MyWork(LPVOID lpParam)
{
DWORD a = 0;
return a;

}




#include<stdio.h>
#include<windows.h>


//服務控制函數
void main()
{
SC_HANDLE hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//新建一個 SCManager
if(hSCManager == NULL)
{
return;
}

SC_HANDLE hService = OpenService(hSCManager,"AAA",SERVICE_ALL_ACCESS);//新建一個服務

if(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)//新建服務失敗?
{
CreateService(hSCManager,
"MyService", //服務名稱
"ShowMyService",//顯示名稱
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,//服務類型
SERVICE_AUTO_START,//何時啓動服務
SERVICE_ERROR_IGNORE,//服務失敗嚴重性
"C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\win32_Service\\Debug\\win32_Service.exe",//服務路徑
NULL,NULL,NULL,NULL,NULL);
}

StartService(hService,NULL,NULL);//開始服務

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章