- File-New-Project
- 選擇alt工程模板,輸入名字TestService
- 點ok後,出現下面界面
- 直接點Next,出現下一界面選Service。
到此,創建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目錄執行
即可啓動服務