2009-05-14 1 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

탐색기를 죽일 절대로 :

다음은 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(); 
    } 
} 
관련 문제