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