
Win32APIのOpenProcess関数を使って、実行ファイル名から実行中のプロセスを取得する場合の方法をを備忘録的な記事として投稿します。
結局総当りです
もう少し、マシな方法が無いか探しましたが、他の記事でもプロセスIDの一覧を取得してから1つ1つ、取得して実行ファイル名を比較して判定するやり方が一般的でした。
総当りなので、力技感が満載ですがこんな感じになります。
DWORD GetProcessIdFromExeName(CString sTargetExeName)
{
DWORD allProc[1024];
DWORD cbNeeded;
int nProc;
int i;
DWORD dwResult = 0;
if (!EnumProcesses(allProc, sizeof(allProc), &cbNeeded))
{
return dwResult;
}
nProc = cbNeeded / sizeof(DWORD);
for (i=0; i<nProc; i++)
{
TCHAR procName[MAX_PATH] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, allProc[i]);
if (NULL != hProcess)
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
{
GetModuleBaseName(hProcess, hMod, procName, sizeof(procName)/sizeof(TCHAR));
CString sProcName = CString(procName).MakeUpper();
if(sProcName == sTargetExeName.MakeUpper())
{
dwResult = allProc[i];
}
}
}
CloseHandle(hProcess);
}
return dwResult;
}
パラメタに取得した実行ファイルのファイル名を指定するとプロセスが実行中であれば、プロセスのハンドルが取得されます。
総当りの力技な手段ですが、アプリケーションを作っているとプロセス取得は、結構良くあるニーズなので、関数としてストックしておくと便利です。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
