news 2026/6/22 2:52:38

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/6/21 2:24:28

如何快速掌握GeoJSON.io:地图数据编辑的终极教程

想要轻松创建专业地图却担心软件太复杂&#xff1f;GeoJSON.io正是你需要的解决方案&#xff01;这款免费开源的地图数据编辑工具让任何人都能在几分钟内上手&#xff0c;无需任何GIS背景。无论你是学生、开发者还是数据分析师&#xff0c;都能通过这个简单教程快速掌握GeoJSON…

作者头像 李华
网站建设 2026/6/12 12:04:49

彻底告别DLL地狱!VC++运行库一键安装方案拯救你的Windows应用

还在为"缺少MSVCP140.dll"、"找不到VCRUNTIME140_1.dll"而抓狂吗&#xff1f;&#x1f92f; 这些烦人的错误提示其实都有一个共同的根源——VC运行库版本碎片化。从2005到2022&#xff0c;微软发布了8个主要版本&#xff0c;每个都需要单独安装&#xff0c…

作者头像 李华
网站建设 2026/6/20 8:16:34

ComfyUI-Manager升级指南:5步搞定平滑迁移

ComfyUI-Manager升级指南&#xff1a;5步搞定平滑迁移 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 还在为ComfyUI-Manager版本升级而头疼吗&#xff1f;&#x1f914; 每次更新后节点失效、配置丢失的困扰确实让人…

作者头像 李华
网站建设 2026/6/17 7:28:56

深度解析 Max-Min 语义分块策略对 RAG 的重构与优化

摘要 在检索增强生成(RAG)系统的构建过程中,文档分块(Chunking)的质量直接决定了检索的精度与生成内容的连贯性。传统的固定长度或基于结构的分割方法,往往因忽略文本内在语义逻辑而导致上下文断裂或噪声引入。今天一起看下论文《Max–Min semantic chunking of documen…

作者头像 李华
网站建设 2026/6/16 16:21:24

如何实现飞书文档一键批量迁移:零基础完整教程

如何实现飞书文档一键批量迁移&#xff1a;零基础完整教程 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 在当今数字化办公环境中&#xff0c;文档迁移和批量处理已成为企业日常运营的重要环节。当公司决定更换办…

作者头像 李华
网站建设 2026/6/19 20:52:20

论证类(归因论证)

目录一. 概述二. 对比实验归因&#xff08;一&#xff09;另有他因质疑&#xff08;把水搅浑&#xff09;1. 另有他因2. “继发关联”的另有他因3. 利用分组正确找到另有他因选项&#xff08;二&#xff09;因果倒置1. 因果倒置和另有他因力度比较&#xff08;三&#xff09;否…

作者头像 李华