枚举进程模块

枚举进程模块

使用 CreateToolhelp32Snapshot 创建进程快照,第一个参数为 TH32CS_SNAPMODULE 时创建进程模块快照,类似枚举进程时使用的 Process32First、Process32Next,枚举进程模块时使用 Module32First、Module32Next 枚举进程模块。

代码:
CEnumModuleDlg:

BEGIN_MESSAGE_MAP(CEnumModuleDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_DLL, &CEnumModuleDlg::OnBnClickedDll)
END_MESSAGE_MAP()

// CEnumModuleDlg 消息处理程序
BOOL CEnumModuleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    CRect rect;
    m_list.GetWindowRect(&rect);
    m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
    m_list.InsertColumn(0, _T("进程ID"), LVCFMT_LEFT, rect.Width() / 4, 0);
    m_list.InsertColumn(1, _T("进程名"), LVCFMT_LEFT, 3*rect.Width() / 5, 1);
    PROCESSENTRY32 pe;
    auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (handle != INVALID_HANDLE_VALUE)
    {
        pe.dwSize = sizeof(PROCESSENTRY32);
        if (!Process32First(handle, &pe))
            return FALSE;
        CString s;
        int item = 0;
        while (TRUE)
        {
            pe.dwSize = sizeof(PROCESSENTRY32);
            if (!Process32Next(handle, &pe))
                break;
            s.Format(_T("%u"), pe.th32ProcessID);
            m_list.InsertItem(item, s);
            m_list.SetItemText(item, 1, pe.szExeFile);
            ++item;
        }
        CloseHandle(handle);
    }

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CEnumModuleDlg::OnBnClickedDll()
{
    auto pos = m_list.GetFirstSelectedItemPosition();
    if (pos)
    {
        int item = m_list.GetNextSelectedItem(pos);
        if (item > -1)
        {
            CString sPid = m_list.GetItemText(item, 0);
            int pId = _ttoi(sPid);
            if (pId > 0)
            {
                CEnumDllDlg dlg;
                dlg.m_pID = pId;
                dlg.DoModal();
            }
        }
    }
}

CEnumDllDlg:

BEGIN_MESSAGE_MAP(CEnumDllDlg, CDialogEx)
END_MESSAGE_MAP()

// CEnumDllDlg 消息处理程序
BOOL CEnumDllDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    CRect rect;
    m_list.GetWindowRect(&rect);
    m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
    m_list.InsertColumn(0, _T("DLL名"), LVCFMT_LEFT, rect.Width() / 5, 0);
    m_list.InsertColumn(1, _T("DLL路径"), LVCFMT_LEFT, 15 * rect.Width() / 20, 1);
    MODULEENTRY32 module = { 0 };
    module.dwSize = sizeof(MODULEENTRY32);
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_pID);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        BOOL ret = Module32First(hSnap, &module);
        int item = 0;
        CString s;
        while (ret)
        {
            m_list.InsertItem(item, module.szModule);
            m_list.SetItemText(item, 1, module.szExePath);
            ++item;
            ret = Module32Next(hSnap, &module);
        }
        CloseHandle(hSnap);
    }

    return TRUE;  // return TRUE unless you set the focus to a control
                  // 异常: OCX 属性页应返回 FALSE
}

效果:
这里写图片描述
这里写图片描述

代码链接:
http://download.csdn.net/download/yangyang031213/9895681.
https://github.com/yangyang0312/cpp/tree/master/windows/EnumModule

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值