资源释放问题

wanjiejay3 2011-11-04 02:34:13

// 查找系统正在运行的进程
BOOL CProcess::EnablePrivilege(HANDLE hToken, LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;// 访问令牌权限结构变量
LUID luid;// 本地唯一标识符结构变量

// 查询SE_DEBUG_NAME权限所对应的luid值
if(!LookupPrivilegeValue(NULL,szPrivName,&luid))
{
AfxMessageBox("Lookup Privilege Value Failed...");
return 0;
}

// 填充Token_Privileges结构
tkp.PrivilegeCount=1;
tkp.Privileges[0].Luid=luid;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

// 提升权限
if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL))
{
AfxMessageBox("Adjust Token Privileges Failed...");
return 0;
}

return(GetLastError()==ERROR_SUCCESS);
}

DWORD CProcess::EnumAllProcess(CString SoftName1)
{
ENUMPROCESS pEnumProcess;
ENUMPROCESSMODULES pEnumProcessModules;
GETMODULEFILENAMEEX pGetModuleFileNameEx;
GETMODULEBASENAME pGetModuleBaseName;

HANDLE hToken;// 访问令牌句柄

DWORD dwPID[MAX_ID];// 接授进程ID的数组
DWORD cbReturn;// 返回的字节数
DWORD dwPCount;// 进程数
DWORD i;
char szFileName[MAX_PATH];// 文件名
char szPathName[MAX_PATH];// 路径名
memset(szFileName,'0',MAX_PATH);
memset(szPathName,'0',MAX_PATH);
char Id[]="ID",Pid[]="PID",Exe[]="ProcessName",Path[]="Path";

HANDLE hProcess; // 进程句柄
HMODULE hModule; // 模块句柄
HINSTANCE hPsDll;// 实例句柄

hPsDll=LoadLibrary("PSAPI.DLL");//获得DLL的实例
if(hPsDll==NULL)
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}

// 获得函数的地址
pEnumProcess=(ENUMPROCESS)GetProcAddress(hPsDll,"EnumProcesses");
pEnumProcessModules=(ENUMPROCESSMODULES)GetProcAddress(hPsDll,"EnumProcessModules");
pGetModuleFileNameEx=(GETMODULEFILENAMEEX)GetProcAddress(hPsDll,"GetModuleFileNameExA");
pGetModuleBaseName=(GETMODULEBASENAME)GetProcAddress(hPsDll,"GetModuleBaseNameA");

if(!(pEnumProcess && pEnumProcessModules && pGetModuleFileNameEx &&pGetModuleBaseName))
{
FreeLibrary(hPsDll);
AfxMessageBox("Get Processs Address Failed...");
}

CString* strName=new CString[50];
// 打开当前进程访问令牌
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
{
if(EnablePrivilege(hToken,SE_DEBUG_NAME))
{
pEnumProcess(dwPID,sizeof(dwPID),&cbReturn);// 枚举进程
dwPCount=cbReturn/sizeof(DWORD);// 计算线程总数

for(i=0;i<dwPCount-1;i++)
{
// 打开进程
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,// 访问权限
false,// 是否允许得到的进程句柄被后创建的子进程继承
dwPID[i]);//进程ID
if(hProcess)
{
// 枚举进程模块
pEnumProcessModules(hProcess,&hModule,sizeof(hModule),&cbReturn);

// 保存文件名
pGetModuleBaseName(hProcess,hModule,szFileName,sizeof(szFileName));
// printf("%-4d %-8u %-8s\n",i,dwPID[i],szFileName);

// 获得进程模块文件名(包含路径)
pGetModuleFileNameEx(hProcess,hModule,szPathName,sizeof(szPathName));
//printf("Path:%s\n\n",szPathName);

// 存数信息
//strName[i] = szFileName;
//CString str = strName[i];
if(strcmp(szFileName,SoftName1) == 0)
{
printf("123");
return dwPID[i];
}
}
}
}
}

// 关闭句柄和实例
::FindClose(hProcess);
::FindClose(hModule);
::FindClose(hToken);
::FreeLibrary(hPsDll);

return -1;
}


请问一下,我这段查找系统正在运行的进程函数,有哪些没有释放资源吗?我在运行函数的时候有时候会出席异常错误。。被迫中断了程序。。很是郁闷。。。请大家帮我看一看,谢谢!
...全文
87 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanjiejay3 2011-11-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/azkabannull/article/details/6314068
看得这篇帖子改的。。。
sophyyoung 2011-11-04
  • 打赏
  • 举报
回复
哪个函数异常呢,跟踪下
sophyyoung 2011-11-04
  • 打赏
  • 举报
回复
我不知道你的 FindClose 是哪来的,不过我看得msdn 里面 OpenProcessToken 和 OpenProcess 都是说
When you finish with the handle, close it using the CloseHandle function
wanjiejay3 2011-11-04
  • 打赏
  • 举报
回复
我在外面加了一个while循环,只跑几次这个函数是没有问题的,但是跑的次数多了,就会出现异常,貌似内存溢出???
while(pro.EnumAllProcess(SoftName1) != -1)
wanjiejay3 2011-11-04
  • 打赏
  • 举报
回复
恩,我这几句关闭句柄对不对呢?
都是哪里需要修改,能不能再具体具体啊?
sophyyoung 2011-11-04
  • 打赏
  • 举报
回复
也要用 CloseHandle 来关呀。
sophyyoung 2011-11-04
  • 打赏
  • 举报
回复
return dwPID[i];
找到了就 return了呀,都不关闭句柄了吗?
oyljerry 2011-11-04
  • 打赏
  • 举报
回复
if(hPsDll==NULL)
{
AfxMessageBox("Load Library Failed...");
}

关闭句柄的地方都判断一下不为空
酒红色的泪 2011-11-04
  • 打赏
  • 举报
回复
if(hPsDll==NULL)
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}

这句话如果真的执行到,肯定会出异常。
而且你都FreeLibrary(hPsDll);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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