わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

サービスの作成(登録)

サービスを作成するには、OpenSCManager()関数でサービス制御マネージャのデータベースを開いて、CreateService()関数を呼び出します。

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <iostream>
#include <windows.h>



/*
	サービスの作成
*/
int ServiceCreate
(
	  std::wstring strServiceName	// サービス名称
	, std::wstring strDispName		// サービス表示名称
	, std::wstring strDescription	// サービス詳細
	, std::wstring strSearvicePath	// サービス実行ファイルパス
)
{
	// 処理結果
	int nRet = 0;

	// サービスデータベースハンドル
	SC_HANDLE hSvcDB = NULL;

	// サービスハンドル
	SC_HANDLE hService = NULL;


	/*
		サービス制御マネージャのデータベースを開く
	*/
	hSvcDB = ::OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE );
	if ( NULL ) {

		// エラー
		wprintf( L"OpenSCManager err = 0x%08x", ::HRESULT_FROM_WIN32( ::GetLastError() ) );
		nRet = -1;
		goto err;
	}

	// 実行ファイルパスの取得
	TCHAR waExePath[ MAX_PATH ];
	::GetModuleFileName( NULL, waExePath, _countof( waExePath ) );


	/*
		サービスの作成
	*/
	hService = ::CreateService(
			  hSvcDB					// サービスデータベースハンドル
			, strServiceName.c_str()	// サービス名
			, strDispName.c_str()		// 表示名
			, SERVICE_CHANGE_CONFIG		// サービスの構成を変更できるようにする
			, SERVICE_WIN32_OWN_PROCESS	// サービスアプリケーションが専用のプロセス内で動作
			, SERVICE_DEMAND_START		// StartService関数が呼び出されたときに、サービスが開始される
			, SERVICE_ERROR_IGNORE		// エラー発生時に、サービス開始操作を続行する
			, strSearvicePath.c_str()	// サービスアプリケーションの実行ファイルパス
			, NULL
			, NULL
			, NULL
			, NULL
			, NULL
		);
	if ( NULL == hService ) {

		// エラー
		wprintf( L"CreateService err = 0x%08x", ::HRESULT_FROM_WIN32( ::GetLastError() ) );
		nRet = -1;
		goto err;
	}

	SERVICE_DESCRIPTION tServiceDescription;

	// サービス詳細
	tServiceDescription.lpDescription = (LPWSTR)strDescription.c_str();

	// サービスのオプション構成パラメータ変更
	if ( 0 == ::ChangeServiceConfig2( hService, SERVICE_CONFIG_DESCRIPTION, &tServiceDescription ) ) {

		// エラー
		wprintf( L"ChangeServiceConfig2 err = 0x%08x", ::HRESULT_FROM_WIN32( ::GetLastError() ) );
		nRet = -1;
		goto err;
	}

	// インストール成功
	std::wcout << L"サービスを作成しました。" << std::endl;


err:
	// サービスクローズ
	if ( NULL != hService ) {
		::CloseServiceHandle( hService );
	}

	// データベースクローズ
	if ( NULL != hSvcDB ) {
		::CloseServiceHandle( hSvcDB );
	}

	// 処理結果
	return( nRet );
}



// サービス名称
#define SERVICE_NAME L"TestService"



/*
	サービスの作成
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// std::wcoutのロケールを設定
	std::wcout.imbue( std::locale( "", std::locale::ctype ) );

	// サービスの作成
	int nRet = ServiceCreate(
			  SERVICE_NAME				// サービス名称
			, L"Test Service"			// サービス表示名称
			, L"テスト用のサービスです"	// サービス詳細
			, L"c:¥¥TestService.exe"	// サービス実行ファイルパス
		);
	if ( 0 != nRet ) {

		// エラー
		std::wcout << L"サービスの作成に失敗しました。" << std::endl;
		return( -1 );
	}

	// 処理結果を返す
	return( 0 );
}



実行結果

サービスを作成しました。






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。