news 2026/3/26 20:22:06

C++ 实现支持 32 位和 64 位进程的模块枚举

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 实现支持 32 位和 64 位进程的模块枚举

C++ 实现支持 32 位和 64 位进程的模块枚举

flyfish

使用 Visual Studio 2022 (VC++ 2022) 创建 MFC 对话框应用程序

源码下载
支持查找32位和64位进程(使用TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32同时枚举两种模块)
输入进程名称(例如notepad.exe),点击“查找进程”按钮
在列表控件(ListCtrl)中显示该进程的所有模块名称、基址、大小、路径

1. 资源部分(在资源编辑器中添加控件)

在对话框资源(ID 为IDD_GETMODULEBASE_DIALOG)中添加以下控件:

类型IDCaption其他属性
Edit ControlIDC_EDIT_PROCESS(空)
ButtonIDC_BTN_SEARCH查找进程
List ControlIDC_LIST_MODULES(空)View: Report, 加四列(见代码)
StaticIDC_STATIC_TIP输入进程名(如 notepad.exe)

2. GetModuleBaseDlg.h

#pragmaonce#include<tlhelp32.h>#include<afxwin.h>#include<afxcmn.h>classCGetModuleBaseDlg:publicCDialogEx{public:CGetModuleBaseDlg(CWnd*pParent=nullptr);enum{IDD=IDD_GETMODULEBASE_DIALOG};protected:virtualvoidDoDataExchange(CDataExchange*pDX);virtualBOOLOnInitDialog();DECLARE_MESSAGE_MAP()public:afx_msgvoidOnBnClickedBtnSearch();private:DWORDGetProcessIDByName(LPCTSTR lpProcessName);BOOLGetAllModules(DWORD dwPID,CListCtrl&listCtrl);CEdit m_editProcess;CButton m_btnSearch;CListCtrl m_listModules;};

3. GetModuleBaseDlg.cpp

#include"pch.h"#include"GetModuleBase.h"#include"GetModuleBaseDlg.h"#include"afxdialogex.h"#ifdef_DEBUG#definenewDEBUG_NEW#endifCGetModuleBaseDlg::CGetModuleBaseDlg(CWnd*pParent/*=nullptr*/):CDialogEx(IDD_GETMODULEBASE_DIALOG,pParent){}voidCGetModuleBaseDlg::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX,IDC_EDIT_PROCESS,m_editProcess);DDX_Control(pDX,IDC_BTN_SEARCH,m_btnSearch);DDX_Control(pDX,IDC_LIST_MODULES,m_listModules);}BEGIN_MESSAGE_MAP(CGetModuleBaseDlg,CDialogEx)ON_BN_CLICKED(IDC_BTN_SEARCH,&CGetModuleBaseDlg::OnBnClickedBtnSearch)END_MESSAGE_MAP()BOOLCGetModuleBaseDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 设置列表控件为报告视图并添加列m_listModules.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_listModules.InsertColumn(0,_T("模块名称"),LVCFMT_LEFT,150);m_listModules.InsertColumn(1,_T("基址"),LVCFMT_LEFT,120);m_listModules.InsertColumn(2,_T("大小"),LVCFMT_LEFT,100);m_listModules.InsertColumn(3,_T("路径"),LVCFMT_LEFT,400);returnTRUE;}// 根据进程名获取 PID(支持大小写不敏感)DWORDCGetModuleBaseDlg::GetProcessIDByName(LPCTSTR lpProcessName){DWORD dwPID=0;HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);if(hSnapshot==INVALID_HANDLE_VALUE)return0;PROCESSENTRY32 pe32={sizeof(pe32)};if(Process32First(hSnapshot,&pe32)){do{if(_tcsicmp(pe32.szExeFile,lpProcessName)==0)// 不区分大小写{dwPID=pe32.th32ProcessID;break;}}while(Process32Next(hSnapshot,&pe32));}CloseHandle(hSnapshot);returndwPID;}// 枚举指定进程的所有模块(同时支持 32/64 位模块)BOOLCGetModuleBaseDlg::GetAllModules(DWORD dwPID,CListCtrl&listCtrl){listCtrl.DeleteAllItems();// 同时使用 TH32CS_SNAPMODULE 和 TH32CS_SNAPMODULE32 可兼容 WOW64 进程的 32 位模块HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32,dwPID);if(hSnapshot==INVALID_HANDLE_VALUE)returnFALSE;MODULEENTRY32 me32={sizeof(me32)};if(Module32First(hSnapshot,&me32)){intnItem=0;do{CString strBase,strSize;strBase.Format(_T("0x%016I64X"),(ULONGLONG)me32.modBaseAddr);strSize.Format(_T("0x%08X"),me32.modBaseSize);listCtrl.InsertItem(nItem,me32.szModule);listCtrl.SetItemText(nItem,1,strBase);listCtrl.SetItemText(nItem,2,strSize);listCtrl.SetItemText(nItem,3,me32.szExePath);nItem++;}while(Module32Next(hSnapshot,&me32));}CloseHandle(hSnapshot);returnTRUE;}voidCGetModuleBaseDlg::OnBnClickedBtnSearch(){CString strProcessName;m_editProcess.GetWindowText(strProcessName);strProcessName.Trim();if(strProcessName.IsEmpty()){AfxMessageBox(_T("请输入进程名称!"));return;}DWORD dwPID=GetProcessIDByName(strProcessName);if(dwPID==0){AfxMessageBox(_T("未找到指定进程!请确认进程名称正确(包含.exe),且进程正在运行。"));m_listModules.DeleteAllItems();return;}CString strTitle;strTitle.Format(_T("进程 %s (PID: %u) 的模块列表"),strProcessName,dwPID);SetWindowText(strTitle);if(!GetAllModules(dwPID,m_listModules)){AfxMessageBox(_T("枚举模块失败,可能没有足够权限。"));m_listModules.DeleteAllItems();}}

4. 项目配置(VS2022)

  1. 项目使用Unicode字符集。
  2. 使用 MFC:项目属性 → 常规 → 使用 MFC → “在共享 DLL 中使用 MFC” 或 “在静态库中使用 MFC”。

使用方法

  1. 运行程序
  2. 在编辑框输入进程可执行文件名,例如:notepad.exechrome.exe
  3. 点击“查找进程”
  4. 列表中会显示该进程加载的所有模块(包括主模块和 DLL)

这样就完整实现了你要求的功能,支持 32 位和 64 位进程的模块枚举。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 13:51:10

香橙派赋能水稻病虫害精准识别:AI+边缘计算守护粮食安全

香橙派赋能水稻病虫害精准识别&#xff1a;AI边缘计算守护粮食安全 作为全球三大粮食作物之一&#xff0c;水稻的产量安全直接关系到全球粮食供给稳定。然而&#xff0c;细菌性穗枯病、稻瘟病等常见病虫害常导致水稻减产甚至绝收&#xff0c;传统人工识别方式不仅效率低下&…

作者头像 李华
网站建设 2026/3/18 15:11:21

应届生考证避坑指南:低费用、高认可度的AI认证怎么选?

对于即将进入职场的毕业生来说&#xff0c;考取相关证书是提升就业竞争力的方式之一。在人工智能领域&#xff0c;各类认证繁多&#xff0c;如何选择适合学生群体、费用合理且具有一定认可度的认证&#xff0c;需要谨慎考虑。本文将从多个角度分析AI相关认证的特点&#xff0c;…

作者头像 李华
网站建设 2026/3/15 16:14:45

数学周刊第50期(2025年12月08日-12月14日)

目录Erdős-Straus非平均集问题终获精确解数学家王虹在香港大学开讲“挂谷猜想”“超级辅助大脑”&#xff0c;将数学家从部分繁琐的探索中解放出来参考资料Erdős-Straus非平均集问题终获精确解 近日&#xff0c;一项发表在《几何与泛函分析》上的研究为这一问题画上了句号。论…

作者头像 李华
网站建设 2026/3/16 1:20:53

Shutter Encoder专业视频编码工具完全指南

Shutter Encoder专业视频编码工具完全指南 【免费下载链接】shutter-encoder A professional video compression tool accessible to all, mostly based on FFmpeg. 项目地址: https://gitcode.com/gh_mirrors/sh/shutter-encoder Shutter Encoder是一款基于Java开发的专…

作者头像 李华
网站建设 2026/3/15 16:14:04

抖音无水印视频下载完整教程:快速保存高清原片

想要完美收藏抖音上的精彩视频内容&#xff0c;却总是被烦人的水印困扰&#xff1f;douyin_downloader抖音无水印下载器正是你需要的终极解决方案。这款开源工具支持抖音视频无水印下载和批量保存&#xff0c;让你轻松获取原始画质的高清视频文件。 【免费下载链接】douyin_dow…

作者头像 李华
网站建设 2026/3/26 10:44:54

AppleRa1n终极指南:iOS激活锁绕过完整解决方案

AppleRa1n终极指南&#xff1a;iOS激活锁绕过完整解决方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当你面对一台被激活锁困住的iPhone时&#xff0c;是否感到束手无策&#xff1f;iOS激活锁绕过…

作者头像 李华