我用链表保存系统中所有的进程,程序可以运行,可是在调试情况下总是发生内存泄露。我把代码贴上,各位帮帮忙,请指出该怎么改,谢谢了!
PROC_PROP为一个结构体。
PROC_PROP *CSysProcHandle::GetProcess()
{
EnablePrivilege(SE_DEBUG_NAME);//提升权限 HANDLE hProcessSnapshot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32;
DWORD nModuleCount;
CString str;
PROC_PROP *head = NULL;
PROC_PROP *p1 = NULL;
PROC_PROP *p2 = NULL;
hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
if(hProcessSnapshot == INVALID_HANDLE_VALUE)
{
AfxMessageBox("1CreateToolhelp32Snapshot() Error!");
return (PROC_PROP *)0;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hProcessSnapshot,&pe32);
if(!bRet)
{
AfxMessageBox("Process32First() Error!");
CloseHandle(hProcessSnapshot);
return (PROC_PROP *)0;
}
if(pe32.th32ProcessID == 0)//第一个进程不需要
{
bRet = Process32Next(hProcessSnapshot,&pe32);
}
if(pe32.th32ProcessID == 4)//第二个进程也不需要
{
bRet = Process32Next(hProcessSnapshot,&pe32);
}
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));
strcpy(p1->procName,pe32.szExeFile); //进程名
str = this->GetProcessPath(pe32.th32ProcessID);
str.TrimLeft("\\?");
strcpy(p1->procPath,str); //进程路径
strcpy(p1->procParent,this-〉ProcessNamepe32.th32ParentProcessID)); //父进程名
//strcpy(p1->crcCode,crc.GetFileCode(p1->procPath)); //CRC校验码
p1->dwProcId = pe32.th32ProcessID; //进程ID
p1->pDll = this->GetProcModules(pe32.th32ProcessID,nModuleCount);
p1->dllCount = nModuleCount; //DLL个数
p2 = p1;
p1->pNextProc = NULL;
while(bRet)
{
if(head == NULL)
{
head = p1;
}
else
{
p2->pNextProc = p1;
}
p2 = p1;
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));
bRet = Process32Next(hProcessSnapshot,&pe32);
if(!bRet)
{
delete p1;
p1 = NULL;
break;
}
strcpy(p1->procName,pe32.szExeFile); //进程名
str = this->GetProcessPath(pe32.th32ProcessID);
str.TrimLeft("\\?");
strcpy(p1->procPath,str); //进程路径
strcpy(p1->procParent,this->GetProcessName(pe32.th32ParentProcessID)); //父进程名
//strcpy(p1->crcCode,crc.GetFileCode(p1->procPath)); //CRC校验码
p1->dwProcId = pe32.th32ProcessID; //进程ID
p1->pDll = this->GetProcModules(pe32.th32ProcessID,nModuleCount);
p1->dllCount = nModuleCount; //DLL个数
}
p2->pNextProc = NULL;
CloseHandle(hProcessSnapshot);
return head;
}
PROC_PROP为一个结构体。
PROC_PROP *CSysProcHandle::GetProcess()
{
EnablePrivilege(SE_DEBUG_NAME);//提升权限 HANDLE hProcessSnapshot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32;
DWORD nModuleCount;
CString str;
PROC_PROP *head = NULL;
PROC_PROP *p1 = NULL;
PROC_PROP *p2 = NULL;
hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
if(hProcessSnapshot == INVALID_HANDLE_VALUE)
{
AfxMessageBox("1CreateToolhelp32Snapshot() Error!");
return (PROC_PROP *)0;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hProcessSnapshot,&pe32);
if(!bRet)
{
AfxMessageBox("Process32First() Error!");
CloseHandle(hProcessSnapshot);
return (PROC_PROP *)0;
}
if(pe32.th32ProcessID == 0)//第一个进程不需要
{
bRet = Process32Next(hProcessSnapshot,&pe32);
}
if(pe32.th32ProcessID == 4)//第二个进程也不需要
{
bRet = Process32Next(hProcessSnapshot,&pe32);
}
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));
strcpy(p1->procName,pe32.szExeFile); //进程名
str = this->GetProcessPath(pe32.th32ProcessID);
str.TrimLeft("\\?");
strcpy(p1->procPath,str); //进程路径
strcpy(p1->procParent,this-〉ProcessNamepe32.th32ParentProcessID)); //父进程名
//strcpy(p1->crcCode,crc.GetFileCode(p1->procPath)); //CRC校验码
p1->dwProcId = pe32.th32ProcessID; //进程ID
p1->pDll = this->GetProcModules(pe32.th32ProcessID,nModuleCount);
p1->dllCount = nModuleCount; //DLL个数
p2 = p1;
p1->pNextProc = NULL;
while(bRet)
{
if(head == NULL)
{
head = p1;
}
else
{
p2->pNextProc = p1;
}
p2 = p1;
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));
bRet = Process32Next(hProcessSnapshot,&pe32);
if(!bRet)
{
delete p1;
p1 = NULL;
break;
}
strcpy(p1->procName,pe32.szExeFile); //进程名
str = this->GetProcessPath(pe32.th32ProcessID);
str.TrimLeft("\\?");
strcpy(p1->procPath,str); //进程路径
strcpy(p1->procParent,this->GetProcessName(pe32.th32ParentProcessID)); //父进程名
//strcpy(p1->crcCode,crc.GetFileCode(p1->procPath)); //CRC校验码
p1->dwProcId = pe32.th32ProcessID; //进程ID
p1->pDll = this->GetProcModules(pe32.th32ProcessID,nModuleCount);
p1->dllCount = nModuleCount; //DLL个数
}
p2->pNextProc = NULL;
CloseHandle(hProcessSnapshot);
return head;
}
解决方案 »
- Webbroswer或者DLG中嵌入的View(继承CHtmlView)显示网页内容部分白屏?????
- 如何将一个数组的值计算后,存入另一个数组
- 接收到另外一台机器发来的bmp位图,位图存在内存,如何显示它?
- 郁闷,奇怪的错误 RemoteDataCtrl
- 如何实现在IE上类似于打开一个swf文件,打开一个自己定义文件类型,来者有分
- 任务栏上的窗口图标为什么有时候会消失了
- 当鼠标挨到客户区右边(或底部)的时候,如何实现自动滚动。
- 问一个问题。VK_F1--VK_F12 与 'p'-'z'的 ascII值范围都是 0x70 --0x7b, 如何区分他们?
- 我希望最终能有一个开发工具叫:Kingsoft Visual WPS。
- IShellIconOverlayIdentifier接口--内存泄漏
- 如何根据分辨率来调整窗口大小?
- 如何以16进制显示一个BYTE数组?
p1->pNextProc = NULL;
while(bRet)
{
if(head == NULL)
{
head = p1;
}
else
{
p2->pNextProc = p1;
}
p2 = p1;
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));。你这个链表有问题,导至无法全部释放掉!!!
这样修改一下就可以了:
。
p2 = p1;
p1->pNextProc = NULL;
while(bRet)
{
if(head == NULL)
{
head = p1;
}p1 = new PROC_PROP
p2->pNextProc = p1;p2 = p1;
memset(p1,0,sizeof(PROC_PROP));