2009-05-14 40 views
0

C++アプリケーションからexplorer.exeを強制終了して再起動したいのですが、どうすればいいですか?C++でプロセスを強制終了して再起動するにはどうすればよいですか?

+0

。 Microsoft製品がシャットダウンして再起動するように常に尋ねる方法に注目してください。だからこそ... –

+0

何が起こっているのか分かります。私はレジストリとエクスプローラを有効にするために再起動する必要がありますが、自動実行設定を変更しています。 – Malfist

答えて

0

現代のWindowsシステムでは、POSIXに準拠しているので、あなたは、外部のプロセスにKILLシグナルを送ることができます。ただし、これはTerminateProcess呼び出しに変換されるので、それを使用することもできます。

http://www.mkssoftware.com/docs/man1/kill.1.asp

2

あなたはそれを殺すためにexplorer.exeとのTerminateProcessを起動するのCreateProcessを使用することができます。 上記の返信で述べたExitProcessは、現在のプロセス(ExitProcessを呼び出すプロセス)にのみ適用されます。

また、OpenProcessを使用して、他の方法ですでに作成されたプロセスにアクセスすることもできます。

BOOL WINAPI CreateProcess(
    __in_opt  LPCTSTR lpApplicationName, 
    __inout_opt LPTSTR lpCommandLine, 
    __in_opt  LPSECURITY_ATTRIBUTES lpProcessAttributes, 
    __in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes, 
    __in   BOOL bInheritHandles, 
    __in   DWORD dwCreationFlags, 
    __in_opt  LPVOID lpEnvironment, 
    __in_opt  LPCTSTR lpCurrentDirectory, 
    __in   LPSTARTUPINFO lpStartupInfo, 
    __out  LPPROCESS_INFORMATION lpProcessInformation 
); 

お知らせあなたはPROCESS_INFORMATION構造体へのポインタを渡すべきために最後のパラメータ、:

OpenProcessTerminateProcess

BOOL WINAPI TerminateProcess 
(
    __in HANDLE hProcess, 
    __in UINT uExitCode 
); 

のCreateProcessは次のシグネチャがあります。この構造体には、CreateProcessが戻るときのハンドル、プロセスIDなどが含まれます。

typedef struct _PROCESS_INFORMATION { 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
}PROCESS_INFORMATION, *LPPROCESS_INFORMATION; 

すでに他の手段でプロセスを作成している場合は、プロセスハンドルなどの情報は利用できません。その場合は、プロセスを列挙し、関心のあるプロセスを見つけ出す必要があります。これはMSDNでここに示してあります。 Enumerating All Processes

+0

どうすればそのハンドルを見つけることができますか? – Malfist

3

(例えばのFindWindowを使用して)アプリケーションのメインウィンドウを識別し、それにWM_QUITを送ります。

SendMessageTimeout()を使用して送信します。この機能を使用すると、アプリケーションがアプリケーションを処理するのを待つ時間を指定できます。タイムアウトが切れたためにSendMessageTimeout()が返された場合は、TerminateProcess()を使用します。 http://msdn.microsoft.com/en-us/library/ms644952(VS.85).aspx

+0

エクスプローラにウィンドウがありますか? – Malfist

1
#include <cstdio> 
#include <windows.h> 
#include <tlhelp32.h> 

void LaunchExplorer() { 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 

    si.cb = sizeof(si); 

    CreateProcess("explorer.exe", NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); 
} 

int main(int, char *[]) { 
    PROCESSENTRY32 entry; 
    entry.dwFlags = sizeof(PROCESSENTRY32); 

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if (Process32First(snapshot, &entry) == TRUE) { 
     while (Process32Next(snapshot, &entry) == TRUE) { 
      if (stricmp(entry.szExeFile, "explorer.exe") == 0) { 
       HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, entry.th32ProcessID); 

       TerminateProcess(hProcess, 0); 

       CloseHandle(hProcess); 

       break; 
      } 
     } 

     LaunchExplorer(); 
    } 

    CloseHandle(snapshot); 

    return 0; 
} 
-1

Explorerを殺すことはありません:それはまったく意味がありません。ここ

はSendMessageTimeout仕様へのリンクです!
Refreshing Win32 Shell apisを使用するだけです。

0

私の答えはあなたには、いくつかの厄介なセキュリティホールを導入することができるように私は強く、これを行うことを避けるために推薦する方法手遅れですが、それを必要とする誰かのためのケースで...

///////////////////////////////////////////////////////////////////////////// 
bool _killExplorer() 
{ 
    CString strCmd1_KillExplorer = _T("taskkill /f /im explorer.exe"); 

    PROCESS_INFORMATION pi; 
    STARTUPINFO si = { sizeof si }; 
    bool bCmd = true; 
    TCHAR szCmdTmp[MAX_PATH]; 
    _tcscpy(szCmdTmp, (LPCTSTR)strCmd1_KillExplorer); 
    if (CreateProcess(NULL, (LPTSTR)szCmdTmp, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { 
     WaitForSingleObject(pi.hProcess, INFINITE); 
     DWORD dwCode = 0; 
     if (!GetExitCodeProcess(pi.hProcess, &dwCode)) 
      bCmd = false; 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 
    else { 
     bCmd = false; 
    } 
    return bCmd; 
} // _killExplorer() 


bool _startExplorer() 
{ 
    CString strCmd2_StartExplorer = _T("%systemroot%\\sysnative\\cmd.exe /c start /B explorer.exe"); 
    TCHAR szCmdTmp[MAX_PATH]; 
    DWORD dwSize = MAX_PATH; 
    ExpandEnvironmentStrings((LPCTSTR)strCmd2_StartExplorer, szCmdTmp, dwSize); 

    PROCESS_INFORMATION pi; 
    STARTUPINFO si = { sizeof si }; 
    bool bCmd = true; 
    if (CreateProcessW(NULL, (LPTSTR)szCmdTmp, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { 
     WaitForSingleObject(pi.hProcess, INFINITE); 
     DWORD dwCode = 0; 
     if (!GetExitCodeProcess(pi.hProcess, &dwCode)) 
      bCmd = false; 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 
    else { 
     bCmd = false; 
    } 
    return bCmd; 
} // _startExplorer() 


void RestartExplorer() 
{ 
    if (_killExplorer()) { 
     _startExplorer(); 
    } 
} 
関連する問題