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