わびさびサンプルソース

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

サービスの再開

サービスを再開するには、OpenService()関数にSERVICE_PAUSE_CONTINUEを渡してオープンして、ControlService()関数をSERVICE_CONTROL_CONTINUEを指定して呼び出します。

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



/*
	サービスの再開
*/
int ContinueService
(
	std::wstring strServiceName	// サービス名
)
{
	// 処理結果
	int nRet = 0;

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

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

	// サービスステータス
	SERVICE_STATUS tServiceStatus;


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

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

	// サービスのオープン
	hService = ::OpenService( hSvcDB, strServiceName.c_str(), SERVICE_PAUSE_CONTINUE );
	if ( NULL == hService ) {

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

	// サービスの一時停止
	if ( 0 == ::ControlService( hService, SERVICE_CONTROL_CONTINUE, &tServiceStatus ) ) {

		// エラー
		wprintf( L"ControlService 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 ) );

	// サービスの再開
	if ( 0 != ContinueService( SERVICE_NAME ) ) {

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

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



実行結果

サービスを再開しました。






わびさびサンプルソース

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