VisualStudio でプロセスIDからプロセス名を取得

環境

Visual Studio 2015

参考サイト

Geekなぺーじ:プロセス名一覧を取得する

使用する 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;
}