VisualStudio でプロセスIDからプロセス名を取得
環境
Visual Studio 2015
参考サイト
使用する Win API
- 呼び出し側プロセスのプロセス識別子を取得します(GetCurrentProcessId)
- 既存のプロセスオブジェクトのハンドルを開きます(OpenProcess)
- 指定されたプロセス内の各モジュールのハンドルを取得します(EnumProcessModules)
- 開いているオブジェクトハンドルを閉じます(CloseHandle)
- 指定されたモジュールのベース名を取得します(GetModuleBaseName)
Sample
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <psapi.h>
static const int PROCESS_SUCCESS = 0;
static const int PROCESS_OPEN_ERROR = -1;
static const int PROCESS_ENUM_MODULES_ERROR = -2;
static const int PROCESS_GET_BASE_NAME_ERROR = -3;
static const int PROCESS_CLOSE_HANDLE_EXCEPTION = -4;
// processName には _MAX_PATH のバッファを確保しておくこと
short GetProcessName(DWORD processId, TCHAR* processNameBuff )
{
HANDLE hProcess = NULL;
short result = PROCESS_SUCCESS;
try
{
// プロセスをオープン
hProcess = OpenProcess(
PROCESS_ALL_ACCESS, FALSE, processId);
if (NULL == hProcess) // 関数が失敗すると、NULL が返る
{
throw PROCESS_OPEN_ERROR;
}
// モジュールハンドルを取得
HMODULE hMod;
DWORD cbNeeded;
BOOL ret = EnumProcessModules(
hProcess, &hMod, sizeof(hMod), &cbNeeded);
if (ret == 0) // 関数が失敗すると、0 が返る
{
throw PROCESS_ENUM_MODULES_ERROR;
}
// モジュールベースネームを取得
DWORD procNameLength = GetModuleBaseName(
hProcess, hMod, processNameBuff, _MAX_PATH);
if (procNameLength == 0) // 関数が失敗すると、0 が返る
{
throw PROCESS_GET_BASE_NAME_ERROR;
}
}
catch(int num)
{
result = num;
printf("Error(%d)(%d)\n", result, GetLastError());
}
try
{
// プロセスハンドルをクローズ
if (hProcess)
{
CloseHandle(hProcess);
}
}
catch (...)
{
result = PROCESS_CLOSE_HANDLE_EXCEPTION;
printf("Exception(%d)\n", GetLastError());
}
return result;
}
int main()
{
TCHAR procName[MAX_PATH] = { 0x00 };
DWORD processId = GetCurrentProcessId();
if (PROCESS_SUCCESS != GetProcessName(processId, procName))
{
printf("GetProcessName Error\n");
}
// プロセス名とPIDを表示
_tprintf(TEXT("%s (PID: %u)\n"), procName, processId);
return 0;
}