为什么CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, nPid)所返回的模块列表与psapi的EnumProcessModules所返回的模块列表不同?

koolfoo 2003-12-19 07:58:21
我在用PSAPI的EnumProcessModules返回某个进程的模块列表时返回很多个模块,但在用CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, nPid)来遍历进程的模块列表时却有的一个模块也没有,这是为什么?也就是说两种方法返回的结果不相同。
哪为兄台可以为兄弟解答?
...全文
431 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
koolfoo 2003-12-21
  • 打赏
  • 举报
回复
偶就是用MSDN上的例程来做的,发现他们返回的结果不一样,所以在这里提出来给各位讨论一下,看看为什么会这样。
osborn 2003-12-20
  • 打赏
  • 举报
回复
是不是CreateToolhelp32Snapshot使用有问题?还是贴出来吧。
vcforever 2003-12-20
  • 打赏
  • 举报
回复
你可以参考一下MSDN上关于遍历进程中模块的example

#include <windows.h>
#include <tlhelp32.h>

BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID,
LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
BOOL bRet = FALSE;
BOOL bFound = FALSE;
HANDLE hModuleSnap = NULL;
MODULEENTRY32 me32 = {0};

// Take a snapshot of all modules in the specified process.

hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE)
return (FALSE);

// Fill the size of the structure before using it.

me32.dwSize = sizeof(MODULEENTRY32);

// Walk the module list of the process, and find the module of
// interest. Then copy the information to the buffer pointed
// to by lpMe32 so that it can be returned to the caller.

if (Module32First(hModuleSnap, &me32))
{
do
{
if (me32.th32ModuleID == dwModuleID)
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
}
while (!bFound && Module32Next(hModuleSnap, &me32));

bRet = bFound; // if this sets bRet to FALSE, dwModuleID
// no longer exists in specified process
}
else
bRet = FALSE; // could not walk module list

// Do not forget to clean up the snapshot object.

CloseHandle (hModuleSnap);

return (bRet);
}
Earthdog 2003-12-20
  • 打赏
  • 举报
回复
那是正常的,因为CreateToolhelp32Snapshot所取得的进程句柄以及模块句柄都是被包装过的,与实际的并不一样,你看说明也知道,该函数返回的句柄只能由该系列的函数使用,由其它函数使用是没有任何效果的
xia renjie 2003-12-20
  • 打赏
  • 举报
回复
CreateToolhelp32Snapshot()函数返回一个句柄hSnapshot,第二个参数是零的话就代表
当前进程通常都使用零。
得到hSnapshot后再调用
Module32Next
Module32First
Process32First
Process32Next
Heap32First
Heap32Next
等函数。。

你的问题是建立了Snapshot后却没有调用Module32First,Module32Next。最后记得用
完后CloseHandle().
koolfoo 2003-12-20
  • 打赏
  • 举报
回复
比如系统进程,使用CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, nPid)就会一个模块都得不到,但用EnumProcessModules却可以得到所有的模块,也就是说有些CreateToolhelp32Snapshot的功能没有完全实现。
MarsZhangLing 2003-12-19
  • 打赏
  • 举报
回复
up

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧