#include <windows.h> #include <stdio.h> void SystemGetServices(void) { ENUM_SERVICE_STATUS Services[100]; DWORD cbBytesNeeded; DWORD dwServicesReturned; DWORD dwResumeHandle = 0; SC_HANDLE hSCManager; BOOL bSuccess; /* char dpName[256]; */ DWORD dwPtr; // サービス制御マネージャを起動する。 hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager == NULL) { // サービスマネージャが起動できなかった。 printf("サービスマネージャが起動出来ませんでした。"); } while (TRUE) { cbBytesNeeded = 0; dwServicesReturned = 0; // サービスの列挙 bSuccess = EnumServicesStatus( hSCManager, // サービス制御マネージャ DBのハンドル SERVICE_WIN32, // 列挙するサービスの種類 SERVICE_STATE_ALL, // 列挙するサービスの状態 Services, // サービス状態バッファのアドレス sizeof(ENUM_SERVICE_STATUS) * 100, // サービス状態バッファのサイズ &cbBytesNeeded, // 必要なバイト数を示す変数のアドレス &dwServicesReturned, // 返されたバイト数を示す変数のアドレス &dwResumeHandle // 次のエントリを示す変数のアドレス ); // 列挙したサービスの情報をポインタ配列に格納 for (dwPtr = 0; dwPtr < dwServicesReturned; ++dwPtr) { // 列挙したサービス名の情報の処理 // ENUM_SERVICE_STATUS構造体(Services配列)の // lpServiceNameメンバがサービス名、 // lpDisplayNameが管理ツールの「サービス」で表示される名称。 printf("サービス名: %s\n", Services->lpServiceName); printf("「サービス」: %s\n", Services->lpDisplayName); } if (!bSuccess) { // まだあるか? switch (GetLastError()) { case ERROR_MORE_DATA: continue; default: CloseServiceHandle(hSCManager); } } else { // 正常終了の場合は、ループから抜ける。 break; } } CloseServiceHandle(hSCManager); } int main(void) { SystemGetServices(); return 0; }