WindowsでC++を使用してPIDからプロセス名を取得するにはどうすればよいですか?
yourプロセスが必要な権利を所有している場合、 OpenProcess 関数が役立つはずです。プロセスへのハンドルを取得したら、 GetModuleFileNameEx 関数を使用して、プロセスのフルパス(.exeファイルへのパス)を取得できます。
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "stdio.h"
#include "psapi.h"
// Important: Must include psapi.lib in additional dependencies section
// In VS2005... Project > Project Properties > Configuration Properties > Linker > Input > Additional Dependencies
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE Handle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
8036 /* This is the PID, you can find one from windows task manager */
);
if (Handle)
{
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))
{
// At this point, buffer contains the full path to the executable
}
else
{
// You better call GetLastError() here
}
CloseHandle(Handle);
}
return 0;
}
プロセス名を取得するには、プロセスハンドルを取得した後、WIN32 API GetModuleBaseName を使用します。 OpenProcess を使用してプロセスハンドルを取得できます。
実行可能ファイル名を取得するには、 GetProcessImageFileName も使用できます。
特定のプロセスの実行可能イメージ名を取得しようとしている場合は、 GetModuleFileName をご覧ください。
この機能を試してください:
std::wstring GetProcName(DWORD aPid)
{
PROCESSENTRY32 processInfo;
processInfo.dwSize = sizeof(processInfo);
HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (processesSnapshot == INVALID_HANDLE_VALUE)
{
std::wcout << "can't get a process snapshot ";
return 0;
}
for(BOOL bok =Process32First(processesSnapshot, &processInfo);bok; bok = Process32Next(processesSnapshot, &processInfo))
{
if( aPid == processInfo.th32ProcessID)
{
std::wcout << "found running process: " << processInfo.szExeFile;
CloseHandle(processesSnapshot);
return processInfo.szExeFile;
}
}
std::wcout << "no process with given pid" << aPid;
CloseHandle(processesSnapshot);
return std::wstring();
}
ツールヘルプライブラリのenumprocess関数を確認してください。
http://msdn.Microsoft.com/en-us/library/ms682629(v = vs.85).aspx
良い例@ http://msdn.Microsoft.com/en-us/library/ms682623(v = vs.85).aspx
上記のすべてのメソッドでは、psapi.dllを読み込む必要があります( 備考セクションを読む )。プロセススナップショットを反復処理することは、効率の観点から実行可能ファイルの名前を取得する際に考慮する必要のないオプションです。
MSDNの推奨に従っても、最良のアプローチは QueryFullProcessImageName を使用することです。
std::string ProcessIdToName(DWORD processId)
{
std::string ret;
HANDLE handle = OpenProcess(
PROCESS_QUERY_LIMITED_INFORMATION,
FALSE,
processId /* This is the PID, you can find one from windows task manager */
);
if (handle)
{
DWORD buffSize = 1024;
CHAR buffer[1024];
if (QueryFullProcessImageNameA(handle, 0, buffer, &buffSize))
{
ret = buffer;
}
else
{
printf("Error GetModuleBaseNameA : %lu", GetLastError());
}
CloseHandle(handle);
}
else
{
printf("Error OpenProcess : %lu", GetLastError());
}
return ret;
}