C/C++ 获取进程完整目录

简介: 输出特定进程所在位置的完整路径,并输出路径。

输出特定进程所在位置的完整路径,并输出路径。

方法1 定位某个进程(比如 QQMusic.exe)所在的全路径,下面是代码:

string GetProcessInfo(HANDLE hProcess,char* processName)
{
    PROCESSENTRY32* pinfo = new PROCESSENTRY32; //进程信息 (pinfo->dwSize = sizeof(PROCESSENTRY32);)
    MODULEENTRY32* minfo = new MODULEENTRY32; //模块信息 (minfo->dwSize = sizeof(MODULEENTRY32);)
    char shortpath[MAX_PATH];                //保存路径变量

    int flag = Process32First(hProcess,pinfo);    // 从第一个进程开始
    while(flag){

        // 如果是 QQMusic.exe 这个进程
        if(strcmp(pinfo->szExeFile, processName) == 0){

            // 创建进程快照
            HANDLE hModule = CreateToolhelp32Snapshot(
                TH32CS_SNAPMODULE,        //(DWORD) 快照返回的对象,TH32CS_SNAPMODULE 是指 "特定进程的使用模块的列表"
                pinfo->th32ProcessID    //(DWORD) 要获取快照进程的PID,当前进程/系统列表 快照时设为0
                ); 

            // 把第一个模块信息给 minfo
            Module32First(
                hModule,  //(HANDLE) CreateToolhelp32Snapshot 的返回句柄
                minfo     // (LPMODULEENTRY32)  接收模块信息
                );    

            // 把文件路径给 shortpath
            GetShortPathName(
                minfo->szExePath,    //  文件路径(但最好不要用这个,因为这个碰到中文会出现乱码)
                shortpath,        // 用来接收 minfo->szExePath 兼容中文的值
                256            // 缓冲区大小
                ); 

            return shortpath;
        }
        
        // 下一个进程
        flag = Process32Next(hProcess, pinfo);
    }

    return NULL;
}

int main()
{
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 创建进程快照
    PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};    // 用来接收 hProcessSnap 的信息
    
    // 遍历进程快照
    while (Process32Next(hProcessSnap,&process)){
        // 找到 QQMusic.exe 进程
        string processName = process.szExeFile; // char* 转 string
        if(processName == "QQMusic.exe"){
            string s_exePath = GetProcessInfo(hProcessSnap,"QQMusic.exe"); // 进程的全路径 
            cout << s_exePath << endl;
            break;
        }
    }
    
    return 0;
}

image.png

方法2 第一种方法有些 bug,下面说下另一种方法

另一种方法:

    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 创建进程快照
    PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};    // 用来接收 hProcessSnap 的信息
    
    // 遍历进程快照
    while (Process32Next(hProcessSnap,&process)){
        // 获取进程名
        string processName = process.szExeFile;
        cout << processName << endl;
        
        // 获取全路径
        char chpath[MAX_PATH];
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
        GetModuleFileNameEx(hProcess,NULL,chpath,sizeof(chpath));
        cout << chpath << endl;
        
        cout << "-------------------" << endl;
    }

但是注意,这种方法不能获取路径在 system32 的进程路径,其余正常:

image.png

方法3(推荐) 目前没有发现 Bug,无法读取应用程序拒绝访问的进程路径,其他没有问题。

// dos 文件路径转 windows 文件路径
BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)
{
    TCHAR            szDriveStr[500];
    TCHAR            szDrive[3];
    TCHAR            szDevName[100];
    INT                cchDevName;
    INT                i;
    
    //检查参数
    if(!pszDosPath || !pszNtPath )
        return FALSE;
 
    //获取本地磁盘字符串
    if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
    {
        for(i = 0; szDriveStr[i]; i += 4)
        {
            if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\"))){continue;}

            szDrive[0] = szDriveStr[i];
            szDrive[1] = szDriveStr[i + 1];
            szDrive[2] = '\0';
            // 查询 Dos 设备名
            if(!QueryDosDevice(szDrive, szDevName, 100)){return FALSE;}
                
            // 命中
            cchDevName = lstrlen(szDevName);
            if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0){
                // 复制驱动器
                lstrcpy(pszNtPath, szDrive);

                // 复制路径
                lstrcat(pszNtPath, pszDosPath + cchDevName);
 
                return TRUE;
            }            
        }
    }
 
    lstrcpy(pszNtPath, pszDosPath);
    
    return FALSE;
}

// 获取进程全路径
BOOL GetProcessFullPath(DWORD dwPID,string &fullPath){
    TCHAR        szImagePath[MAX_PATH];
    TCHAR        pszFullPath[MAX_PATH];
    HANDLE        hProcess;
    
    // 初始化失败
    if(!pszFullPath){return FALSE;}
    pszFullPath[0] = '\0';

    // 获取进程句柄失败
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
    if(!hProcess){return FALSE;}
        
    // 获取进程完整路径失败
    if(!GetProcessImageFileName(
        hProcess,                    // 进程句柄
        szImagePath,                // 接收进程所属文件全路径的指针
        MAX_PATH                    // 缓冲区大小
    )){
        CloseHandle(hProcess);
        return FALSE;
    }
 
    // 路径转换失败
    if(!DosPathToNtPath(szImagePath, pszFullPath)){
        CloseHandle(hProcess);
        return FALSE;
    }
 
    CloseHandle(hProcess);
 
    // 导出文件全路径
    fullPath = pszFullPath;

    return TRUE;
}

调用例子:

tring str_filePath;
GetProcessFullPath(进程ID,str_filePath);
目录
相关文章
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
66 5
|
1月前
|
Linux C语言 C++
C/C++进程超详细详解【下部分】(系统性学习day8)
C/C++进程超详细详解【下部分】(系统性学习day8)
|
1月前
|
消息中间件 Linux API
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
|
1月前
|
Linux C++ iOS开发
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(二)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
253 2
|
1月前
|
Linux API C++
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(一)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
320 2
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
67 0
|
1月前
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
83 1
|
1月前
|
存储 Linux 程序员
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
76 0
|
1月前
|
监控 C++
C++ Qt开发:QProcess进程管理模块
Qt是一个跨平台的C++图形库,简化了窗体应用开发,支持通过拖放组件提升效率。本章节关注`QProcess`组件,它用于控制和管理进程,例如执行命令、运行可执行文件及与外部进程通信。`QProcess`提供多种方法如`start`、`waitForStarted`和`waitForFinished`等,实现启动、监控和交互。示例展示了如何使用`QProcess`获取系统进程和信息,通过`tasklist`和`systeminfo`命令,并将结果展示在`QTreeWidget`中。
29 0
C++ Qt开发:QProcess进程管理模块
|
1月前
|
消息中间件 存储 算法
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
43 1

相关实验场景

更多