【发布时间】:2011-01-14 11:19:25
【问题描述】:
免责声明:这是该程序要求的一部分,因此它并不意味着任何不好的事情。如果您发现任何误用,请随时指出。我是 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
【问题讨论】:
-
我知道这可能会带来一些问题,为什么我应该重新启动 Outlook。这是因为我需要在一些修改后强制 Outlook 使用新的注册表值。当然,在执行此方法之前会要求多次确认。或者有其他选择吗?
标签: c++ windows winapi process outlook