備忘録

備忘録

C++でプロセス名からプロセスIDを取得する

Ⅰ. はじめに

タイトルの通り「C++でプロセス名からプロセスIDを取得する」方法です。

Ⅱ. サンプルプログラム

1. CreateToolhelp32Snapshot を利用する場合
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>

DWORD GetProcessIdByName(const wchar_t *processName)
{
  auto entry = PROCESSENTRY32{ sizeof(PROCESSENTRY32) };

  auto hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  if (Process32First(hSnapshot, &entry))
  {
    do
    {
      if (wcsstr(processName, entry.szExeFile))
      {
        CloseHandle(hSnapshot);
        return entry.th32ProcessID;
      }
    } while (Process32Next(hSnapshot, &entry));
  }

  CloseHandle(hSnapshot);
  return -1;
}

int main()
{
  auto processId = GetProcessIdByName(L"notepad.exe");
  std::cout << "ProcessId=" << processId << std::endl;;

  return 0;
}
2. EnumProcesses を利用する場合
#include <Windows.h>
#include <psapi.h>
#include <iostream>

DWORD GetProcessIdByName(const wchar_t *targetProcessName)
{
  DWORD processIds[1024];
  DWORD cbNeeded;

  if (EnumProcesses(processIds, sizeof(processIds), &cbNeeded))
  {
    for (DWORD i = 0; i < cbNeeded / sizeof(DWORD); i++)
    {
      TCHAR processName[MAX_PATH] = { 0 };
      auto hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processIds[i]);

      if (hProcess != NULL)
      {
        DWORD size = MAX_PATH;
        if (QueryFullProcessImageName(hProcess, NULL, processName, &size))
        {
          // std::wcout << processName << "," << targetProcessName << std::endl;
          if (wcsstr(processName, targetProcessName))
          {
            CloseHandle(hProcess);
            return processIds[i];
          }
        }

        CloseHandle(hProcess);
      }
    }
  }

  return -1;
}

int main()
{
  auto processId = GetProcessIdByName(L"notepad.exe");
  std::cout << "ProcessId=" << processId << std::endl;;

  return 0;
}

Ⅲ. 実行結果

f:id:kagasu:20171125160310p:plain