//服務程式主函數。#include <stdio.h>//#include "stdafx.h"#include <Windows.h>#include <iostream>#define SZAPPNAME "serverSample" //服務程式名#define SZSERVICENAME "serviceSample" //識別服務的內部名//內部變數bool bDebugServer=false;SERVICE_STATUS ssStatus;SERVICE_STATUS_HANDLE sshStatusHandle;DWORD dwErr=0;TCHAR szErr[256];//下面的函數由程式實現void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);void WINAPI Service_Ctrl(DWORD dwCtrlCode);void installService();void removeService();void debugService(int argc,char** argv);bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);void AddToMessageLog(LPTSTR lpszMsg);void ServiceStop() ;void ServicePause() ;void ServiceContinue();int main(int argc, char* argv[]){ SERVICE_TABLE_ENTRY dispatchTable[]= { {TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main}, { NULL,NULL} }; if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/"))) { if(_stricmp("install",argv[1]+1)==0) { installService(); } else if(_stricmp("remove",argv[1]+1)==0) { removeService(); } else if(_stricmp("debug",argv[1]+1)==0) { bDebugServer=true; debugService(argc,argv); } else { //如果未能和上面的如何參數匹配,則可能是服務控制管理程式來啟動該程式。立即調用 //StartServiceCtrlDispatcher 函數。 printf("%s - install to install the service /n",SZAPPNAME); printf("%s - remove to remove the service /n",SZAPPNAME); printf("%s - debug to debug the service /n",SZAPPNAME); printf("/n StartServiceCtrlDispatcher being called./n"); printf("This may take several seconds.Please wait./n"); if(!StartServiceCtrlDispatcher(dispatchTable)) AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed.")); else AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK.")); } exit(0); } return 0;}//服務進入點函數void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具體服務的初始化入口函數void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv){ //註冊服務控制處理函數 sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl); //如果註冊失敗 if(!sshStatusHandle) { goto cleanup; return; } //初始化 SERVICE_STATUS 結構中的成員 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; ssStatus.dwServiceSpecificExitCode=0; //更新服務狀態 if(!ReportStatusToSCMgr( SERVICE_START_PENDING,//服務狀態,The service is starting. NO_ERROR, //退出碼 3000)) //等待時間 goto cleanup; //更新服務狀態失敗則轉向 cleanup ServiceStart(dwArgc,lpszArgv); return;cleanup: //把服務狀態更新為 SERVICE_STOPPED,並退出。 if(sshStatusHandle) (void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);}void WINAPI Service_Ctrl(DWORD dwCtrlCode){ //處理控制請求碼 switch(dwCtrlCode) { //先更新服務狀態為 SERVICDE_STOP_PENDING,再停止服務。 case SERVICE_CONTROL_STOP: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServiceStop(); //由具體的服務程式實現 return; //暫停服務 case SERVICE_CONTROL_PAUSE: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServicePause(); //由具體的服務程式實現 ssStatus.dwCurrentState=SERVICE_PAUSED; return; //繼續服務 case SERVICE_CONTROL_CONTINUE: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServiceContinue(); //由具體的服務程式實現 ssStatus.dwCurrentState=SERVICE_RUNNING; return; //更新服務狀態 case SERVICE_CONTROL_INTERROGATE: break; //無效控制碼 default: break; } ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);}//安裝服務程式void installService(){ SC_HANDLE schService; SC_HANDLE schSCManager; TCHAR szPath[512]; //得到程式磁碟檔案的路徑 //A handle to the loaded module whose path is being requested. If this parameter is NULL, //GetModuleFileName retrieves the path of the executable file of the current process. if(GetModuleFileName(NULL,szPath,512)==0) {/* _tprintf(TEXT("Unable to install %s - %s /n"), TEXT(SZAPPNAME), GetLastError());//@1擷取調用函數返回的最後錯誤碼*/ printf("Unable to install %s - %s /n" , SZAPPNAME, GetLastError()) ; return; } //開啟服務管理資料庫 schSCManager=OpenSCManager( NULL, //如果為NULL,則指本機電腦 NULL, //預設的資料庫 SC_MANAGER_ALL_ACCESS //要求所有的訪問權 ); if(schSCManager) { //登記服務程式 schService=CreateService( schSCManager, //服務管理資料庫控制代碼 TEXT(SZSERVICENAME), //服務名 TEXT(SZAPPNAME), //用於顯示服務的標識 SERVICE_ALL_ACCESS, //響應所有的訪問請求 SERVICE_WIN32_OWN_PROCESS, //服務類型 SERVICE_DEMAND_START, //啟動類型 SERVICE_ERROR_NORMAL, //錯誤控制類型 szPath, //服務程式磁碟檔案的路徑 NULL, //服務不屬於任何組 NULL, //沒有tag標識符 NULL, //啟動服務所依賴的服務或服務組,這裡僅僅是一個Null 字元串 NULL, //LocalSystem 帳號 NULL); if(schService) { /* _tprintf(TEXT("%s installed. /n"),TEXT(SZAPPNAME));*/ printf("the service created!\n") ; printf("%s installed. /n", SZAPPNAME) ; CloseServiceHandle(schService); } else { /* _tprintf(TEXT("CreateService failed - %s /n"),GetLastError());*/ printf("CreateService failed - %s /n" , GetLastError()) ; } CloseServiceHandle(schSCManager); } else printf("OpenSCManager failed - %s /n", GetLastError()) ; //_tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());}//停止和刪除已安裝的服務程式void removeService(){ SC_HANDLE schService; SC_HANDLE schSCManager; //開啟服務管理資料庫 schSCManager=OpenSCManager( NULL, //本機電腦 NULL, //預設的資料庫 SC_MANAGER_ALL_ACCESS //要求所有的訪問權 ); if(schSCManager) { //擷取服務程式控制代碼 schService=OpenService( schSCManager, //服務管理資料庫控制代碼 TEXT(SZSERVICENAME), //服務名 SERVICE_ALL_ACCESS //響應所有的訪問請求 ); if(schService) { //試圖停止服務 send a control code to the service ; if(ControlService( schService, //服務程式控制代碼(從上面開啟服務獲得的) SERVICE_CONTROL_STOP, //停止服務要求碼 &ssStatus //接收最後的服務狀態資訊 )) { /* _tprintf(TEXT("Stopping %s."),TEXT(SZAPPNAME));*/ printf("Stopping %s.", SZAPPNAME) ; Sleep(1000); //等待服務停止 // while(QueryServiceStatus(schService,&ssStatus)) { if(SERVICE_STOP_PENDING==ssStatus.dwCurrentState) { // _tprintf(TEXT(".")); printf(".") ; Sleep(1000); } else break; } if(SERVICE_STOPPED==ssStatus.dwCurrentState) printf("/n %s stopped. /n", SZAPPNAME) ; // _tprintf(TEXT("/n %s stopped. /n"),TEXT(SZAPPNAME)); else printf("/n %s failed to stopp. /n", SZAPPNAME); // _tprintf(TEXT("/n %s failed to stopp. /n"),TEXT(SZAPPNAME)); } //刪除已安裝的服務程式安裝 if(DeleteService(schService)) printf("%s removed. /n",SZAPPNAME) ; // _tprintf(TEXT("%s removed. /n"),TEXT(SZAPPNAME)); else // _tprintf(TEXT("DeleteService failed - %s. /n"), GetLastError()); printf("DeleteService failed - %s. /n", GetLastError()) ; CloseServiceHandle(schService); } else printf("OpenService failed - %s /n", GetLastError()) ; // _tprintf(TEXT("OpenService failed - %s /n"),GetLastError()); CloseServiceHandle(schSCManager); } else printf("OpenSCManager failed - %s /n" ,GetLastError()); // _tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());}void ServiceStop(){}void ServicePause(){}void ServiceContinue(){}void debugService(int argc,char** argv){ printf("debuging service ...\n") ;}void AddToMessageLog(LPTSTR lpszMsg){}//服務進入點函數void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv)//具體服務的初始化入口函數{}bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint){ return true ;}
http://www.vckbase.com/http://www.vckbase.com/document/viewdoc/?id=1474http://edu.gamfe.com/tutor/d/12405.htmlhttp://blog.csdn.net/qpl007/article/details/143801 http://www.cnblogs.com/lartely/archive/2011/04/10/2011770.html