news 2026/9/25 10:14:10

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.exe、chrome.exe
  3. 点击“查找进程”
  4. 列表中会显示该进程加载的所有模块(包括主模块和 DLL)

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

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

ViGEmBus虚拟手柄驱动:解锁Windows游戏控制新境界

ViGEmBus虚拟手柄驱动&#xff1a;解锁Windows游戏控制新境界 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 还在为游戏手柄兼容性而烦恼吗&#xff1f;ViGEmBus虚拟手柄驱动为你带来完美的解决方案&#xff01;这款强大的Windows…

作者头像 李华
网站建设 2026/9/24 0:36:34

百度网盘直链解析技术原理与实现方案

百度网盘直链解析技术原理与实现方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 本文旨在深入分析百度网盘分享链接的直链解析技术&#xff0c;通过系统化的技术实现方案&…

作者头像 李华
网站建设 2026/9/24 0:36:22

小模型也能有大智慧!斯坦福新框架破解多模态“瘦身”难题,原来问题不在“思考”而在“看懂”

小模型也能有大智慧&#xff01;斯坦福新框架破解多模态“瘦身”难题&#xff0c;原来问题不在“思考”而在“看懂” 现在打开手机就能用的AI识图、智能答疑&#xff0c;背后都藏着多模态大模型的身影——它们既能看懂图片&#xff0c;又能分析推理&#xff0c;比如GPT-4V、Gem…

作者头像 李华
网站建设 2026/9/24 7:08:27

仿写文章创作专家Prompt

仿写文章创作专家Prompt 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 你是一名专业的文章创作专家&#xff0c;专门负责技术工具类文章的仿写创作。请严格遵循以下规范进行工作&…

作者头像 李华
网站建设 2026/9/24 5:46:51

如何免费搭建Windows系统日志监控中心?Visual Syslog Server完整配置指南

在当今复杂的网络环境中&#xff0c;Windows系统日志监控已成为每个系统管理员必备的技能。Visual Syslog Server作为一款专为Windows平台打造的免费开源日志接收工具&#xff0c;提供了完整的图形化界面和强大的日志处理功能&#xff0c;让你轻松实现系统日志实时监控和智能告…

作者头像 李华