2013-05-20 129 views

回答

5

我會建議使用GetCurrentProcessId來獲取您正在運行的服務的進程ID。然後使用EnumServiceStatusEx來枚舉服務(而不必親自使用註冊表)。

您可以將ENUM_SERVICE_STATUS_PROCESS.ServiceStatusProcess.dwProcessId的進程ID與您當前的進程ID匹配並獲取名稱。例如:

void enumerateServices(DWORD processId) 
{ 
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, 
     SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT); 


    if (hSCM == NULL) 
    { 
     return; 
    } 
    DWORD bufferSize = 0; 
    DWORD requiredBufferSize = 0; 
    DWORD totalServicesCount = 0; 
    EnumServicesStatusEx(hSCM, 
     SC_ENUM_PROCESS_INFO, 
     SERVICE_WIN32, 
     SERVICE_STATE_ALL, 
     nullptr, 
     bufferSize, 
     &requiredBufferSize, 
     &totalServicesCount, 
     nullptr, 
     nullptr); 

    std::vector<BYTE> buffer(requiredBufferSize); 
    EnumServicesStatusEx(hSCM, 
     SC_ENUM_PROCESS_INFO, 
     SERVICE_WIN32, 
     SERVICE_STATE_ALL, 
     buffer.data(), 
     buffer.size(), 
     &requiredBufferSize, 
     &totalServicesCount, 
     nullptr, 
     nullptr); 

    LPENUM_SERVICE_STATUS_PROCESS services = 
     reinterpret_cast<LPENUM_SERVICE_STATUS_PROCESS>(buffer.data()); 
    for (unsigned int i = 0; i < totalServicesCount; ++i) 
    { 
     ENUM_SERVICE_STATUS_PROCESS service = services[i]; 
     if (service.ServiceStatusProcess.dwProcessId == processId) 
     { 
      // This is your service. 
      std::wcout << service.lpServiceName << L"PID: " << 
       service.ServiceStatusProcess.dwProcessId << std::endl; 
     } 
    } 

    (void)CloseServiceHandle(hSCM); 

} 

有關錯誤處理的通常免責聲明適用。我也沒有正確檢查緩衝區大小等。

+0

非常感謝Steve!不幸的是,我的評價不讓我獎勵你。 – user1309871

+0

@ user1309871如果您喜歡,可以將答案標記爲已接受。答案的左側應該有一個勾號。 – Steve

相關問題