免責事項:これはプログラムの要件の一部ですので、悪い意味はありません。あなたが1つを見つけた場合は、誤用を指摘してください。私はC++の初心者です。ERROR_INVALID_HANDLE on TerminateProcess(VS C++)
基本的に、私はWindowsでOutlook.exe
をC++で再起動しようとしています。
これは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が新しいレジストリ値を使用するように強制する必要があるためです。もちろん、このメソッドが実行される前に複数の確認が求められます。それとも何か別の選択肢がありますか? –