私のコード (DLL) が、サービスとして実行されるアプリケーション内で既に実行されていると仮定します。サービス名を見つける方法は?プロセス パスを取得してレジストリ内のサービスを列挙するよりも、より洗練された方法が必要です。
質問する
2734 次
1 に答える
7
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 );
}
エラー処理に関する通常の免責事項が適用されます。また、バッファサイズなどを適切にチェックしていません。
于 2013-05-20T19:51:30.080 に答える