2009-05-14 2 views
0

Я хотел бы убить и перезапустить explorer.exe из моего приложения на C++, как бы я это сделал?Как я могу убить, а затем перезапустить процесс на C++?

+0

я настоятельно рекомендую не делать этого, так как вы можете ввести некоторые неприятные дыры в безопасности. Обратите внимание на то, что продукты Microsoft всегда спрашивают вас, как закрыть и перезагрузить компьютер? Вот почему ... –

+0

Я понимаю, что происходит. Я меняю настройки автозапуска, но реестр и проводник необходимо перезапустить, чтобы он вступил в силу. – Malfist

ответ

0

Поскольку современные системы Windows совместимы с POSIX, вы можете отправить сигнал KILL внешним процессам. Однако обратите внимание, что это будет переведено на вызов TerminateProcess, поэтому вы можете просто использовать его.

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

2

Вы можете использовать CreateProcess нереститься explorer.exe и TerminateProcess, чтобы убить его. ExitProcess, как указано выше, относится только к текущему процессу (то есть к процессу, из которого вы вызываете ExitProcess).

Вы также можете использовать OpenProcess для доступа к процессу, который уже создан другими способами.

OpenProcess

TerminateProcess

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

CreateProcess имеет следующую подпись:

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. Эта структура содержит дескриптор, идентификатор процесса и т. Д., Когда возвращается CreateProcess.

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().

Вот ссылка на спецификации SendMessageTimeout: 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

Никогда не убить проводника: это не имеет никакого смысла!
Просто используйте 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(); 
    } 
} 
Смежные вопросы