news 2026/5/9 17:21:19

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/5/9 2:28:19

如何高效使用B站视频下载工具:实用技巧完全攻略

如何高效使用B站视频下载工具&#xff1a;实用技巧完全攻略 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 想要永久保存B站上的精彩视…

作者头像 李华
网站建设 2026/4/23 18:14:51

QT实战:qrc资源动态加载

QRC资源文件动态加载 Qt资源系统&#xff08;QRC&#xff09;是Qt框架中用于管理二进制资源的机制&#xff0c;通过XML文件描述资源路径&#xff0c;编译时打包到可执行文件中。动态加载QRC文件能提升灵活性和维护性。 基本用法 动态加载的核心是QResource类和QDir的addResourc…

作者头像 李华
网站建设 2026/5/7 12:55:16

完全掌握Windows平台asar文件处理:WinAsar实战指南

完全掌握Windows平台asar文件处理&#xff1a;WinAsar实战指南 【免费下载链接】WinAsar 项目地址: https://gitcode.com/gh_mirrors/wi/WinAsar 还在为Electron应用asar文件处理头疼吗&#xff1f;&#x1f62b; 面对复杂的命令行操作&#xff0c;普通用户往往望而却步…

作者头像 李华
网站建设 2026/5/5 18:40:50

Lumafly终极指南:轻松管理Hollow Knight模组的跨平台神器

Lumafly终极指南&#xff1a;轻松管理Hollow Knight模组的跨平台神器 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly Lumafly是一款专为《空洞骑士》玩家设计的…

作者头像 李华
网站建设 2026/5/5 7:33:12

设计标注工具如何彻底改变你的工作流

设计标注工具如何彻底改变你的工作流 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure "又是凌晨两点&#xff0c;我还在手动标注设计稿的间距和尺寸..." 这是多少设计师的日常&#xff1f;当你面对复杂的界面…

作者头像 李华
网站建设 2026/5/5 15:27:30

如何快速掌握ExifToolGui:照片元数据管理的终极解决方案

如何快速掌握ExifToolGui&#xff1a;照片元数据管理的终极解决方案 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾经面对数千张照片却无法快速找到特定时间或地点拍摄的那一张&#xff1f;或者想…

作者头像 李华