サービスを一時停止するには、OpenService()関数にSERVICE_PAUSE_CONTINUEを渡してオープンして、ControlService()関数をSERVICE_CONTROL_PAUSEを指定して呼び出します。
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <iostream>
#include <windows.h>
/*
サービスの一時停止
*/
int PauseService
(
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_PAUSE, &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 != PauseService( SERVICE_NAME ) ) {
// エラー
std::wcout << L"サービスの一時停止に失敗しました。" << std::endl;
return( -1 );
}
// 処理結果を返す
return( 0 );
}
サービスを一時停止しました。