我有一个功能:
HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
...
result=Process32First(snapshot,&pe);
while(result) {
if(!_stricmp(process_name,pe.szExeFile)) {
processes.push_back(pe.th32ProcessID);
}
result=Process32Next(snapshot,&pe);
}
for(dword_vector::iterator i=processes.begin(); i!=processes.end(); ++i){
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE, FALSE, *i);
if(hProcess) {
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
}
它在32位平台上运行良好,但在64位平台上,OpenProcess为某些进程返回Access_denied(32位上的相同进程可以很好地计算)。我试图打开的所有进程都是32位。
可能有什么问题?
答案 0 :(得分:0)
您在64位平台上登录的用户是否无权终止这些进程?例如在Vista上,UAC处于活动状态,您是管理员,但没有运行升级并尝试关闭系统进程。
答案 1 :(得分:0)
这可能真的存在,但您是否正在执行网络驱动器中的代码?我已经看到.NET应用程序在从网络驱动器运行时无法完成非常基本的操作。
如果是,请尝试将可执行文件移动到本地磁盘,看看是否有帮助。
是的,我知道这是一个非常奇怪的建议,我只想知道这是否有问题: - )
答案 2 :(得分:0)
您的应用程序是64位进程还是32位进程?您无法从32位进程打开64位进程。
使用任务管理器确保您的应用程序是64位的。如果没有,修复并将其编译为64位,您应该能够打开其他64位进程和32位进程。
如果您的应用是32位,则可能是权限问题。尝试以管理员身份运行它,看看是否能解决问题。
答案 3 :(得分:0)
我对操作有相同的假设。经过多次测试后,我知道access_denied过程的原因是它们在SYSTEM用户下,而不是因为它们是64位。