1
假設我的代碼(DLL)已經在作爲服務運行的應用程序內部運行。 如何找到服務名稱? 我希望比在註冊表中獲取進程路徑和枚舉服務更優雅。Win32 C++如何獲取當前應用程序服務名稱
假設我的代碼(DLL)已經在作爲服務運行的應用程序內部運行。 如何找到服務名稱? 我希望比在註冊表中獲取進程路徑和枚舉服務更優雅。Win32 C++如何獲取當前應用程序服務名稱
我會建議使用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);
}
有關錯誤處理的通常免責聲明適用。我也沒有正確檢查緩衝區大小等。
非常感謝Steve!不幸的是,我的評價不讓我獎勵你。 – user1309871
@ user1309871如果您喜歡,可以將答案標記爲已接受。答案的左側應該有一個勾號。 – Steve