use*_*871 1 service winapi system
假设我的代码(DLL)已在作为服务运行的应用程序内运行.如何找到服务名称?我想要比在注册表中获取进程路径和枚举服务更优雅的方式.
我建议使用GetCurrentProcessId来获取您正在运行的服务的进程ID.然后使用EnumServiceStatusEx枚举服务(无需自己使用注册表).
您可以将进程ID与ENUM_SERVICE_STATUS_PROCESS.ServiceStatusProcess.dwProcessId当前进程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 );
}
Run Code Online (Sandbox Code Playgroud)
有关错误处理的常用免责声明适用.我还没有正确检查缓冲区大小等.
| 归档时间: |
|
| 查看次数: |
2001 次 |
| 最近记录: |