开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 629|回复: 5
收起左侧

[已解决] C++如何取电脑内所有进程的根目录

 关闭 [复制链接]
结帖率:83% (90/109)
发表于 2023-7-19 22:32:01 | 显示全部楼层 |阅读模式   浙江省丽水市
9精币
C++如何取电脑内所有进程的根目录 ,找了两天一直没找到,

最佳答案

查看完整内容

[md]**用这条把** // 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 += 4) ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

结帖率:100% (13/13)

签到天数: 23 天

发表于 2023-7-19 22:32:02 | 显示全部楼层   广东省清远市

用这条把

// 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';
        // cha询 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;

}

// 调用
string str_filePath;
GetProcessFullPath(进程ID,str_filePath);


补充内容 (2023-7-19 23:37):
其他参考:https://www.cnblogs.com/pythonsc ... /02/22/2922549.html

评分

参与人数 1荣誉 +1 收起 理由
项目部004 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

签到天数: 9 天

发表于 2023-7-19 22:37:52 | 显示全部楼层   广东省广州市

翻译精易模块里的进程_枚举进程_取路径即可~
回复

使用道具 举报

发表于 2023-7-19 23:20:21 | 显示全部楼层   广东省广州市
{:7_437:} 在自己的脑海里寻找了2天吗?你这个问题 随便找个搜索引擎查一下 一大堆解答。
以下打来 来自GPT

要获取计算机内所有进程的根目录,你可以使用操作系统提供的API函数。在C++中,具体的方法取决于你使用的操作系统。

下面是在不同操作系统上获取所有进程根目录的一些示例代码:

对于Windows操作系统,你可以使用Windows API函数来获取进程根目录。下面是使用GetModuleFileName函数获取当前进程的根目录示例代码,在循环中遍历所有进程并获取它们的根目录:
```C++

include

include

include

int main() {
DWORD processes[1024];
DWORD bytesReturned;

// 获取所有进程ID
if (EnumProcesses(processes, sizeof(processes), &bytesReturned)) {
    DWORD numProcesses = bytesReturned / sizeof(DWORD);
    for (DWORD i = 0; i < numProcesses; ++i) {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes[i]);
        if (hProcess != NULL) {
            TCHAR processPath[MAX_PATH];
            if (GetModuleFileNameEx(hProcess, NULL, processPath, MAX_PATH)) {
                std::cout << "Process ID: " << processes[i] << ", Root Directory: " << processPath << std::endl;
            }
            CloseHandle(hProcess);
        }
    }
}

return 0;

}

对于Linux操作系统,你可以使用/proc文件系统获取进程的根目录。下面是一个使用/proc文件系统获取所有进程根目录的示例代码:

include

include

include

include

include

std::string GetProcessRootDirectory(const std::string& processID) {
std::string rootDirectory;
std::string procPath = "/proc/" + processID + "/";

struct stat s;
if (stat(procPath.c_str(), &s) == 0) {
    if (S_ISDIR(s.st_mode)) {
        rootDirectory = procPath;
    }
}

return rootDirectory;

}

std::vector GetProcessIDs() {
std::vector processIDs;

DIR* dir = opendir("/proc");
if (dir != nullptr) {
    struct dirent* entry;
    while ((entry = readdir(dir)) != nullptr) {
        if (entry->d_type == DT_DIR) {
            std::string name = entry->d_name;
            if (std::all_of(name.begin(), name.end(), ::isdigit)) {
                processIDs.push_back(name);
            }
        }
    }
    closedir(dir);
}

return processIDs;

}

int main() {
std::vector processIDs = GetProcessIDs();

for (const auto& processID : processIDs) {
    std::string rootDirectory = GetProcessRootDirectory(processID);
    if (!rootDirectory.empty()) {
        std::cout << "Process ID: " << processID << ", Root Directory: " << rootDirectory << std::endl;
    }
}

return 0;

}


这些示例代码演示了在Windows和Linux上获取所以进程根目录的基本方法。请注意,这里只提供了基本框架,你可能需要根据实际需求进行进一步的开发和调整。其他操作系统可能有不同的方法和API来实现此功能,你可以针对特定操作系统进行进一步的研究和开发
回复

使用道具 举报

结帖率:100% (13/13)

签到天数: 23 天

发表于 2023-7-19 23:34:29 | 显示全部楼层   广东省清远市

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;

}

回复

使用道具 举报

结帖率:0% (0/1)

签到天数: 4 天

发表于 2023-7-20 09:09:20 高大上手机用户 | 显示全部楼层   广东省广州市
哈哈,你这是不上网找两天吧,百du一下就有了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表