gpt4 book ai didi

c++ - TerminateProcess 上的 ERROR_INVALID_HANDLE (VS C++)

转载 作者:可可西里 更新时间:2023-11-01 13:55:03 25 4
gpt4 key购买 nike

免责声明:这是程序要求的一部分,因此没有任何不良意义。如果您发现任何误用,请随时指出。我是 C++ 的初学者。

基本上,我正在尝试使用 C++ 在 Windows 上重新启动 Outlook.exe

这是我用来重启 Outlook 的代码。

#include <TlHelp32.h>
void RestartOutlook() {
PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) };
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);

MODULEENTRY32 Mo = {sizeof (MODULEENTRY32) };

if(Process32First(hSnapshot, &Pc)){
do{
if(!_stricmp(Pc.szExeFile, "outlook.exe")) {
DWORD pid = Pc.th32ProcessID;

HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);

//kill outlook
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
DWORD fdwExit = 0;
GetExitCodeProcess(process, &fdwExit);
TerminateProcess(process, fdwExit);

char * path;
if (Module32First(hModuleSnapshot, &Mo)) {
path = Mo.szExePath;

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof (si);
CreateProcess(path, NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi);
}


}
}while(Process32Next(hSnapshot, &Pc));
}
}

有趣的是,这段代码在 Windows 7 上运行得非常好。而在 Windows XP (SP3) 上,我得到了重复的 Outlook。 GetLastError 给我 6: ERROR_INVALID_HANDLE。经过数小时的研究,我真的一无所知。

有什么想法吗?

反正C++不是我的专业。我做网络 :)

上面的代码是以下来源的混合:

1: http://www.istorya.net/forums/programming/107435-how-can-i-kill-a-process-using-c.html

2: http://code.activestate.com/recipes/576362-list-system-process-and-process-information-on-win/

环境:Windows 7、Windows XP、VS2010、Outlook 2003、Outlook 2007、Outlook 2010

最佳答案

我找到了罪魁祸首。

原因就在这一行:

HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);

根据 http://msdn.microsoft.com/en-us/library/ms684880(v=vs.85).aspx , PROCESS_ALL_ACCESS 对于Windows XP/NT系统来说太大了,或者更多细节:

The size of the PROCESS_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP/2000, the PROCESS_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation.

肯定是我在 7 上编译这个程序,而在 XP 上运行肯定会导致问题。

所以解决方案是,将 PROCESS_ALL_ACCESS 更改为 PROCESS_TERMINATE,这

HANDLE process = OpenProcess(PROCESS_TERMINATE, TRUE, pid);

完成!

感谢@DReJ 的快速回复:)

关于c++ - TerminateProcess 上的 ERROR_INVALID_HANDLE (VS C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com