枚举进程模块
使用 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