サービスの登録と抹消



Windowsのサービスプログラムは、ユーザーがWindowsにログインする前から
起動できる、起動と停止をWindowsが制御してくれる、GUIとして
コントロールパネルのサービスマネージャを使えるなどのポイントがあり、
常駐プログラム的なものを開発する場合には必須の機能です。
ここでは、Windowsのサービスプログラムのシステムへの登録と削除の方法を
示します。

サービスの登録

サービスの停止と抹消




サービスの登録

まずは、サンプルをご覧下さい。
int sub_register_service()
{
	int		nsts ;
	char		filbuf[1024] ;
	SC_HANDLE 	newService, scm;

	// ***
	// ***	サービスプログラムのパス名を指定
	// ***

	sprintf( filbuf, "C:\\temp\\service_program.exe" ) ;

	// ***
	// ***	SC Manager
	// ***

	if ( (scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE)) == 0 )
	{
		TRACE( "サービスマネージャに接続できません" ) ;
		return -1 ;
	}

	// ***
	// ***	サービスを追加
	// ***

	newService = CreateService(
		scm, 
		"servtest",			// サービス名
		"Windows Service Test",		// コントロールパネルへの表示名
		SERVICE_ALL_ACCESS,		
		SERVICE_WIN32_OWN_PROCESS,	
		SERVICE_AUTO_START,		// or SERVICE_DEMAND_START,
		SERVICE_ERROR_NORMAL,		
		filbuf,				// path
		0, 0, 0, 0, 0);

	if (!newService)
	{
		if ( GetLastError() == ERROR_SERVICE_EXISTS )
		{
			TRACE( "サービスは既に登録されています\n" ) ;
			nsts = TRUE ;
		} else {
			TRACE( "LAST ERROR = %d\n", GetLastError() ) ;
			TRACE( "ERROR: サービスの登録に失敗しました。" ) ;
			nsts = 1 ;
		}
	} else {
		TRACE( "登録に成功しました\n" ) ;
		nsts = 0 ;
	}

	// ***
	// ***	clean up
	// ***

	CloseServiceHandle(newService);
	CloseServiceHandle(scm);

	return nsts ;
}


CreateService API の6番目のパラメータには、SERVICE_AUTO_STARTを
指定すると、そのサービスはWindowsの起動とともに「自動」的に起動され、
SERVICE_DEMAND_STARTを指定すると、そのサービスは、コントロールパネルの
サービスマネージャから手動で起動する形式に設定できます。



サービスの停止と抹消

では、ソースを見てみましょう。
int sub_stop_remove_service()
{
	SC_HANDLE	service, scm;
	BOOL		success;
	SERVICE_STATUS	status;

	// ***
	// ***	SCMに接続
	// ***

	if ( !(scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE)) )
	{
		TRACE( "ERROR:サービスマネージャに接続できません\n" ) ;
		return FALSE ;
	}

	// ***
	// ***	サービスのハンドルを取得
	// ***

	service = OpenService( 	scm, 				// Handle
				"servtest", 			// サービス名
				SERVICE_ALL_ACCESS | DELETE);	//

	if ( !service )
	{
		TRACE( "ERROR:サービスにアクセスできません\n" ) ;
		return FALSE ;
	}
	
	// ***
	// ***	サービスが起動中であれば、まず停止させる
	// ***

	if ( !(success = QueryServiceStatus(service, &status)) )
	{
		TRACE( "ERROR: サービスの状況取得に失敗しました\n" ) ;
		return FALSE ;
	}

	if (status.dwCurrentState != SERVICE_STOPPED)
	{
		TRACE( "サービスが停止していないので停止させます\n" ) ;

		if ( !(success = ControlService(service, SERVICE_CONTROL_STOP, &status)) )
		{
			TRACE( "ERROR: サービスを停止できません\n" ) ;
			return FALSE ;
		}

		Sleep(1500);
	}
	
	// ***
	// ***	サービスを抹消する
	// ***

	if ( !(success = DeleteService(service)) )
	{
		TRACE( "ERROR: サービスを抹消できません\n" ) ;
		return FALSE ;
	}

	// ***
	// ***	Clean up
	// ***

	CloseServiceHandle(service);
	CloseServiceHandle(scm);

	return TRUE ;
}



OpenService APIのパラメータで指定している「サービス名」は、
先のサービス登録API 「CreateService」の第二パラメータで指定したものと
同じ物を指定します。


戻る