不知道自己发现的对不对 恳请大家批评
先看一下MSDN的两处说明 我的是2001年最后一季的msdn 是vc6最后一个版本的msdn
To destroy the snapshot, use the CloseHandle function
而msdn中还有这样的说明
The snapshot returned is a copy of the current state of the system. To close a snapshot call the CloseToolhelp32Snapshot function. Do not call the CloseHandle function to close the snapshot call. Calling CloseHandle to close the snapshot call generates a memory leak.
第二个意思就是说 不要调用CloseHandle 因为会造成内存泄漏
有点迷惑啊 到底用那个函数呢
百度百科中说
#include "StdAfx.h"
#include "windows.h"
#include "tlhelp32.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
PROCESSENTRY32 pe32;
//在使用这个结构前,先设置它的大小
pe32.dwSize = sizeof(pe32);
//给系统内所有的进程拍个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot 调用失败.\n");
return -1;
}
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while (bMore)
{
printf("进程名称:%s\n",pe32.szExeFile);
printf("进程ID:%u\n\n",pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap,&pe32);
}
//不要忘记清除掉snapshot对象
//这里有误,关闭快照不能调用CloseHandle,这会造成内存泄漏
//::CloseHandle(hProcessSnap);
//调用CloseToolhelp32Snapshot关闭快照
::CloseToolhelp32Snapshot(hProcessSnap);
return 0;
}
//这里有误,关闭快照不能调用CloseHandle,这会造成内存泄漏
//::CloseHandle(hProcessSnap);
//调用CloseToolhelp32Snapshot关闭快照
::CloseToolhelp32Snapshot(hProcessSnap);
后来详细研究了一下 百度百科错了 CloseToolhelp32Snapshot只适用于WinCE平台 百度百科用的也是 人民邮电出版社 王艳平 张铮老师 windows程序设计的代码 两位老师书里的代码不错 就是应该用CloseHandle来清除snapshot对象
而上面两个MSDN的说明详细看了一下 一个是SDK Platform的 一个是WinCE的 而 在SDK下 根本没有CloseToolhelp32Snapshot这个函数
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!