news 2026/4/23 16:10:17

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/4/17 19:31:25

3个技巧快速掌握STL文件预览:让3D模型管理更高效

3个技巧快速掌握STL文件预览&#xff1a;让3D模型管理更高效 【免费下载链接】stl-thumb Thumbnail generator for STL files 项目地址: https://gitcode.com/gh_mirrors/st/stl-thumb 还在为海量STL文件的管理而烦恼吗&#xff1f;每次想要找到特定的3D模型&#xff0c…

作者头像 李华
网站建设 2026/4/18 17:43:10

5分钟解决百度网盘限速问题:macOS极速下载终极方案

还在为百度网盘蜗牛般的下载速度而烦恼吗&#xff1f;每次看到几KB/s的下载速度&#xff0c;是不是都想放弃使用这个必备工具&#xff1f;今天我要分享一个专为macOS用户设计的百度网盘加速解决方案&#xff0c;让你在5分钟内告别限速困扰&#xff0c;享受接近SVIP会员的高速下…

作者头像 李华
网站建设 2026/4/23 3:09:47

Mammoth.js实战指南:Word文档转HTML的完整解决方案

Mammoth.js实战指南&#xff1a;Word文档转HTML的完整解决方案 【免费下载链接】mammoth.js Convert Word documents (.docx files) to HTML 项目地址: https://gitcode.com/gh_mirrors/ma/mammoth.js 在日常工作中&#xff0c;你是否经常遇到这样的场景&#xff1a;客户…

作者头像 李华
网站建设 2026/4/23 8:16:45

终极指南:3步轻松部署OpenKM文档管理系统

终极指南&#xff1a;3步轻松部署OpenKM文档管理系统 【免费下载链接】document-management-system OpenKM is a Open Source Document Management System 项目地址: https://gitcode.com/gh_mirrors/do/document-management-system OpenKM是一款功能强大的开源文档管理…

作者头像 李华