

まずは、サンプルをご覧下さい。
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」の第二パラメータで指定したものと
同じ物を指定します。