首页 > 其他 > 详细

根据进程ID获取进程路径

时间:2014-06-18 21:19:55      阅读:479      评论:0      收藏:0      [点我收藏+]

根据进程ID获取进程路径有两种方法:
方法1:OpenProcess --> GetModuleFileNameEx
方法2:OpenProcess --> EnumProcessModules --> GetModuleFileNameEx


注意事项:
1、使用GetModuleFileNameEx()而不是GetModuleFileName()
2、GetModuleFileNameEx()指定的hProcess需要PROCESS_QUERY_INFORMATION | PROCESS_VM_READ权限
3、函数使用细节参考MSDN


代码片段:

HWND hWnd = FindWindow(NULL, _T("计算器"));
if (hWnd != NULL)
{
    DWORD dwProcID = 0;
    ::GetWindowThreadProcessId(hWnd, &dwProcID);
    HMODULE hProcess = (HMODULE)OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcID);
    
    if (hProcess != NULL)
    {
        CString strLog;

        // 方法1:OpenProcess --> GetModuleFileNameEx
        TCHAR szPath[MAX_PATH];
        //DWORD dwRet = GetModuleFileName(hProcess, szPath, MAX_PATH);
        DWORD dwRet = GetModuleFileNameEx(hProcess, NULL, szPath, MAX_PATH);
        if (dwRet == 0)
        {
            strLog.Format(_T("[Method1] GetModuleFileNameEx failed. errcode:%d\n"), ::GetLastError());
            OutputDebugString(strLog);
        }
        else
        {
            strLog.Format(_T("[Method1] GetModuleFileNameEx get path %s\n"), szPath);
            OutputDebugString(strLog);
        }


        // 方法2:OpenProcess --> EnumProcessModules --> GetModuleFileNameEx
        HMODULE hMod = NULL;
        DWORD cb = 0;
        if (EnumProcessModules((HANDLE)hProcess, &hMod, sizeof(hMod), &cb))
        {
            //dwRet = GetModuleFileName(hMod, szPath, MAX_PATH);
            dwRet = GetModuleFileNameEx(hProcess, hMod, szPath, MAX_PATH);
            if (dwRet == 0)
            {
                strLog.Format(_T("[Method2] GetModuleFileNameEx failed. errcode:%d\n"), ::GetLastError());
                OutputDebugString(strLog);
            }
            else
            {
                strLog.Format(_T("[Method2] GetModuleFileNameEx get path %s\n"), szPath);
                OutputDebugString(strLog);
            }
            
            // 不要对hMod调用CloseHandle
        }
        else
        {
            strLog.Format(_T("[Method2] EnumProcessModules failed. errcode:%d\n"), ::GetLastError());
            OutputDebugString(strLog);
        }


        ::CloseHandle(hProcess);
    }
}

 

输出结果:

[Method1] GetModuleFileNameEx get path C:\Windows\system32\calc.exe
[Method2] GetModuleFileNameEx get path C:\Windows\system32\calc.exe

 

 

根据进程ID获取进程路径,布布扣,bubuko.com

根据进程ID获取进程路径

原文:http://www.cnblogs.com/shokey520/p/3790333.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!