サービスを作成するには、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 ); }
サービスを作成しました。