vs2010 編寫windows service 服務程序

  1.  File-New-Projectvs2010 <wbr>編寫windows <wbr>service <wbr>服務程序
  2. 選擇alt工程模板,輸入名字TestServicevs2010 <wbr>編寫windows <wbr>service <wbr>服務程序

  3. 點ok後,出現下面界面vs2010 <wbr>編寫windows <wbr>service <wbr>服務程序


  4. 直接點Next,出現下一界面選Service。vs2010 <wbr>編寫windows <wbr>service <wbr>服務程序

    到此,創建windows service工程完成。在TestService.cpp中增加下面的代碼(紅色)

// TestService.cpp : Implementation of WinMain


#include "stdafx.h"
#include "resource.h"
#include "TestService_i.h"


#include <stdio.h>

using namespace ATL;

class CTestServiceModule : publicATL::CAtlServiceModuleT< CTestServiceModule,IDS_SERVICENAME >
 {
public :
 DECLARE_LIBID(LIBID_TestServiceLib)
 DECLARE_REGISTRY_APPID_RESOURCEID(IDR_TESTSERVICE,"{25AF9FF6-DEA2-4E6C-8EBC-B3BB81B74226}")
  HRESULT InitializeSecurity()throw()
 {
  // TODO : CallCoInitializeSecurity and provide the appropriate security settingsfor your service
  // Suggested - PKT LevelAuthentication,
  // Impersonation Level ofRPC_C_IMP_LEVEL_IDENTIFY
  // and an appropiate Non NULLSecurity Descriptor.

  return S_OK;
 }
  HRESULTRegisterAppId(bool bService = false) throw ();
  HRESULT PreMessageLoop(intnShowCmd) throw();
  HRESULT PostMessageLoop()throw();
  void OnStop() throw();
  void OnPause() throw();
  void OnContinue()throw();
 };

HRESULTCTestServiceModule::RegisterAppId(bool bService ) throw ()
{
 HRESULT hr = S_OK;
 BOOL res = __super::RegisterAppId(bService);
 if (bService)
 {
  if (IsInstalled())
  {
   SC_HANDLEhSCM = ::OpenSCManagerW(NULL, NULL, SERVICE_CHANGE_CONFIG);
   SC_HANDLEhService = NULL;
   if (hSCM ==NULL)
   {
    hr= AtlHresultFromLastError();
   }
   else
   {
    hService= ::OpenService(hSCM, m_szServiceName,SERVICE_CHANGE_CONFIG);
    if(hService != NULL)
    {
     ::ChangeServiceConfig(hService,SERVICE_NO_CHANGE,
      SERVICE_AUTO_START,//修改服務爲自動啓動
      NULL,NULL, NULL, NULL, NULL, NULL, NULL,
      m_szServiceName);// 通過修改資源IDS_SERVICENAME 修改服務的顯示名字

     SERVICE_DESCRIPTIONDescription;
     TCHARszDescription[1024];
     ZeroMemory(szDescription,1024);
     ZeroMemory(&Description,sizeof (SERVICE_DESCRIPTION));
     lstrcpy(szDescription,_T("測試服務描述信息" ));
     Description.lpDescription= szDescription;
     ::ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION, &Description);
     ::CloseServiceHandle(hService);
    }
    else
    {
     hr= AtlHresultFromLastError();
    }
    ::CloseServiceHandle(hSCM);
   }
  }
 }
 return hr;
}

HRESULTCTestServiceModule::PreMessageLoop(int nShowCmd) throw()
{
 // 讓暫停繼續按鈕可以使用
 m_status.dwControlsAccepted =m_status.dwControlsAccepted |SERVICE_ACCEPT_PAUSE_CONTINUE;

 HRESULT hr =__super::PreMessageLoop(nShowCmd);
 // 微軟Bug
 if (hr == S_FALSE)
  hr = S_OK;

 //這裏添加自己的初始化代碼...

 if (SUCCEEDED(hr))
 {
  // 這個狀態一定要修改,否則會出現1053錯誤,
  // 這個錯誤我花了很多時間才搞定
  SetServiceStatus(SERVICE_RUNNING);
 }

 return hr;
}

HRESULTCTestServiceModule::PostMessageLoop() throw()
{
 HRESULT hr = __super::PostMessageLoop();

 if (FAILED(hr))
  return hr;

 //這裏添加自己的清除代碼

 return hr;
}

void CTestServiceModule::OnStop()throw()
{
 __super::OnStop();
 SetServiceStatus(SERVICE_STOPPED);
}

void CTestServiceModule::OnPause()throw()
{
 __super::OnPause();
 SetServiceStatus(SERVICE_PAUSED);
}

void CTestServiceModule::OnContinue()throw()
{
 __super::OnContinue();
 SetServiceStatus(SERVICE_RUNNING);
}

CTestServiceModule _AtlModule;

 

//
extern "C" int WINAPI _tWinMain(HINSTANCE , HINSTANCE ,
        LPTSTR, int nShowCmd)
{
 return _AtlModule.WinMain(nShowCmd);
}

 

編譯,打開cmd窗口,進入生成的TestService.exe目錄執行

vs2010 <wbr>編寫windows <wbr>service <wbr>服務程序

即可啓動服務
發佈了11 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章