最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)支持32位和64位進(jìn)程的模塊枚舉

 更新時間:2025年12月15日 08:39:59   作者:二分掌柜的  
這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)支持32位和64位進(jìn)程的模塊枚舉,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

使用 Visual Studio 2022 (VC++ 2022) 創(chuàng)建 MFC 對話框應(yīng)用程序

支持查找 32位和64位進(jìn)程(使用 TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32 同時枚舉兩種模塊)

輸入進(jìn)程名稱(例如 notepad.exe),點(diǎn)擊“查找進(jìn)程”按鈕

在列表控件(ListCtrl)中顯示該進(jìn)程的所有模塊名稱、基址、大小、路徑

1. 資源部分(在資源編輯器中添加控件)

在對話框資源(ID 為 IDD_GETMODULEBASE_DIALOG)中添加以下控件:

類型IDCaption其他屬性
Edit ControlIDC_EDIT_PROCESS(空)
ButtonIDC_BTN_SEARCH查找進(jìn)程
List ControlIDC_LIST_MODULES(空)View: Report, 加四列(見代碼)
StaticIDC_STATIC_TIP輸入進(jìn)程名(如 notepad.exe)

2. GetModuleBaseDlg.h

#pragma once
#include <tlhelp32.h>
#include <afxwin.h>
#include <afxcmn.h>

class CGetModuleBaseDlg : public CDialogEx
{
public:
    CGetModuleBaseDlg(CWnd* pParent = nullptr);

    enum { IDD = IDD_GETMODULEBASE_DIALOG };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    virtual BOOL OnInitDialog();

    DECLARE_MESSAGE_MAP()

public:
    afx_msg void OnBnClickedBtnSearch();

private:
    DWORD GetProcessIDByName(LPCTSTR lpProcessName);
    BOOL GetAllModules(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
#define new DEBUG_NEW
#endif

CGetModuleBaseDlg::CGetModuleBaseDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_GETMODULEBASE_DIALOG, pParent)
{
}

void CGetModuleBaseDlg::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()

BOOL CGetModuleBaseDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 設(shè)置列表控件為報(bào)告視圖并添加列
    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);

    return TRUE;
}

// 根據(jù)進(jìn)程名獲取 PID(支持大小寫不敏感)
DWORD CGetModuleBaseDlg::GetProcessIDByName(LPCTSTR lpProcessName)
{
    DWORD dwPID = 0;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
        return 0;

    PROCESSENTRY32 pe32 = { sizeof(pe32) };
    if (Process32First(hSnapshot, &pe32))
    {
        do
        {
            if (_tcsicmp(pe32.szExeFile, lpProcessName) == 0)  // 不區(qū)分大小寫
            {
                dwPID = pe32.th32ProcessID;
                break;
            }
        } while (Process32Next(hSnapshot, &pe32));
    }

    CloseHandle(hSnapshot);
    return dwPID;
}

// 枚舉指定進(jìn)程的所有模塊(同時支持 32/64 位模塊)
BOOL CGetModuleBaseDlg::GetAllModules(DWORD dwPID, CListCtrl& listCtrl)
{
    listCtrl.DeleteAllItems();

    // 同時使用 TH32CS_SNAPMODULE 和 TH32CS_SNAPMODULE32 可兼容 WOW64 進(jìn)程的 32 位模塊
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPID);
    if (hSnapshot == INVALID_HANDLE_VALUE)
        return FALSE;

    MODULEENTRY32 me32 = { sizeof(me32) };
    if (Module32First(hSnapshot, &me32))
    {
        int nItem = 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);
    return TRUE;
}

void CGetModuleBaseDlg::OnBnClickedBtnSearch()
{
    CString strProcessName;
    m_editProcess.GetWindowText(strProcessName);
    strProcessName.Trim();

    if (strProcessName.IsEmpty())
    {
        AfxMessageBox(_T("請輸入進(jìn)程名稱!"));
        return;
    }

    DWORD dwPID = GetProcessIDByName(strProcessName);
    if (dwPID == 0)
    {
        AfxMessageBox(_T("未找到指定進(jìn)程!請確認(rèn)進(jìn)程名稱正確(包含.exe),且進(jìn)程正在運(yùn)行。"));
        m_listModules.DeleteAllItems();
        return;
    }

    CString strTitle;
    strTitle.Format(_T("進(jìn)程 %s (PID: %u) 的模塊列表"), strProcessName, dwPID);
    SetWindowText(strTitle);

    if (!GetAllModules(dwPID, m_listModules))
    {
        AfxMessageBox(_T("枚舉模塊失敗,可能沒有足夠權(quán)限。"));
        m_listModules.DeleteAllItems();
    }
}

4. 項(xiàng)目配置(VS2022)

項(xiàng)目使用 Unicode 字符集。

使用 MFC:項(xiàng)目屬性 → 常規(guī) → 使用 MFC → “在共享 DLL 中使用 MFC” 或 “在靜態(tài)庫中使用 MFC”。

5.使用方法

  • 運(yùn)行程序
  • 在編輯框輸入進(jìn)程可執(zhí)行文件名,例如:notepad.exe、chrome.exe
  • 點(diǎn)擊“查找進(jìn)程”
  • 列表中會顯示該進(jìn)程加載的所有模塊(包括主模塊和 DLL)

這樣就完整實(shí)現(xiàn)了你要求的功能,支持 32 位和 64 位進(jìn)程的模塊枚舉。

到此這篇關(guān)于C++實(shí)現(xiàn)支持32位和64位進(jìn)程的模塊枚舉的文章就介紹到這了,更多相關(guān)C++模塊枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章帶你了解C語言的選擇結(jié)構(gòu)

    一篇文章帶你了解C語言的選擇結(jié)構(gòu)

    這篇文章主要為大家介紹了C語言的選擇結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例詳解

    C語言實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用C語言開發(fā)一個簡單的日志備份守護(hù)進(jìn)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • c語言指針之二級指針示例

    c語言指針之二級指針示例

    這篇文章主要介紹了c語言指針中的二級指針示例,需要的朋友可以參考下
    2014-04-04
  • 利用C語言實(shí)現(xiàn)HashTable

    利用C語言實(shí)現(xiàn)HashTable

    根據(jù)KEY從hashtable中獲取接點(diǎn),步驟是先根據(jù)KEY計(jì)算hash值,然后從hashtable中找到指定的接點(diǎn)或者接點(diǎn)鏈表
    2013-09-09
  • C++中Stack(棧)的使用方法與基本操作詳解

    C++中Stack(棧)的使用方法與基本操作詳解

    Stack是一種常見的數(shù)據(jù)結(jié)構(gòu),常常被用來解決遞歸問題、括號匹配問題、函數(shù)調(diào)用棧等等。本文將介紹C++中stack的使用方法及基本操作,需要的可以參考一下
    2023-05-05
  • C BlowFish對稱加密算法詳解

    C BlowFish對稱加密算法詳解

    這篇文章主要介紹了C BlowFish對稱加密算法詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++實(shí)現(xiàn)小型復(fù)數(shù)計(jì)算器

    C++實(shí)現(xiàn)小型復(fù)數(shù)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)小型復(fù)數(shù)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++實(shí)現(xiàn)結(jié)束應(yīng)用進(jìn)程小工具

    C++實(shí)現(xiàn)結(jié)束應(yīng)用進(jìn)程小工具

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)結(jié)束應(yīng)用進(jìn)程小工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 使用QPainter畫一個3D正方體

    使用QPainter畫一個3D正方體

    這篇文章主要為大家詳細(xì)介紹了使用QPainter畫一個3D正方體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C語言矩陣連乘 (動態(tài)規(guī)劃)詳解

    C語言矩陣連乘 (動態(tài)規(guī)劃)詳解

    這篇文章主要介紹了C語言矩陣連乘 (動態(tài)規(guī)劃)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論

肥东县| 门头沟区| 惠州市| 武邑县| 洮南市| 潮州市| 土默特左旗| 久治县| 海门市| 嘉禾县| 安多县| 库尔勒市| 绥芬河市| 横峰县| 广州市| 米脂县| 靖边县| 登封市| 桦南县| 永清县| 安宁市| 云梦县| 无极县| 茶陵县| 马边| 平顺县| 莱州市| 新竹市| 东海县| 新巴尔虎右旗| 璧山县| 辰溪县| 陈巴尔虎旗| 荃湾区| 周至县| 中牟县| 库车县| 盐边县| 阜新| 辽阳县| 庄浪县|