windows後台服務程式範例

來源:互聯網
上載者:User

//服務程式主函數。#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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.