내 C++ 응용 프로그램에서 explorer.exe를 강제 종료하고 다시 시작하려면 어떻게해야합니까?어떻게 C++에서 프로세스를 종료 한 다음 다시 시작할 수 있습니까?
답변
현대 Windows 시스템은 POSIX 호환이므로 외부 프로세스에 KILL 신호를 보낼 수 있습니다. 그러나이 작업은 TerminateProcess 호출로 변환되므로 사용하는 것이 좋습니다.
당신은 그것을 죽일 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 구조에 대한 포인터를 전달해야하는 마지막 매개 변수 :
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
어떻게 핸들을 찾을 수 있습니까? – Malfist
응용 프로그램의 주 창을 식별하고 (예 : FindWindow를 사용하여) WM_QUIT를 보냅니다.
SendMessageTimeout()을 사용하여 보내십시오. 이 함수를 사용하면 응용 프로그램이 처리 할 때까지 기다릴 기간을 지정할 수 있습니다. 제한 시간이 만료되어 SendMessageTimeout()이 반환되면 TerminateProcess()를 사용하십시오. http://msdn.microsoft.com/en-us/library/ms644952(VS.85).aspx
탐색기에 창이 있습니까? – Malfist
#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;
}
탐색기를 죽일 절대로 :
다음은 SendMessageTimeout 사양에 대한 링크의 그것은 전혀 의미가 없습니다!
Refreshing Win32 Shell apis를 사용하기 만하면됩니다.
당신은 성가신 보안 구멍을 소개 할 수 있습니다로 내 대답은 너무 늦었지만 그냥 필요한 사람을위한 경우 ...
/////////////////////////////////////////////////////////////////////////////
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();
}
}
- 1. 사용자가 c에서 프로그램을 다시 시작할 수 있습니까?
- 2. 파이썬 종료 스레드 다시 시작할 수 없습니다
- 3. Process.Start에서 프로세스를 시작할 수 없습니다.
- 4. 앱을 프로그래밍 방식으로 다시 시작할 수 있습니까?
- 5. RSpec 2에서 어떻게 프로세스를 생성하고 몇 가지 예제를 실행 한 다음 그 프로세스를 종료 할 수 있습니까?
- 6. CreateProcess 프로세스를 시작할 수 없습니다.
- 7. Windows에서 Python을 사용하면 어떻게 프로세스를 종료 할 수 있습니까?
- 8. 어떻게 두 개의 프로세스를 동시에 시작할 수 있습니까?
- 9. Windows 서비스의 UI가있는 프로세스를 어떻게 시작할 수 있습니까?
- 10. 서비스의 하위 프로세스를 종료 할 수 있습니까?
- 11. C# 어떻게 시작 프로세스를 종료 할 수 있습니까?
- 12. 일시 중지 된 후 프로세스를 다시 시작할 수 없습니다.
- 13. 셸 스크립트에서 AIX에서 JBoss 5.1을 어떻게 다시 시작할 수 있습니까?
- 14. 재활용 중에 Application_end를 호출하면 어떻게 다시 시작할 수 있습니까? Application_Start?
- 15. 파일을 변경하면 어떻게 ASP.NET을 다시 시작할 수 있습니까?
- 16. Javascript - 양식 제출을 일시 중지 한 다음 다시 시작할 수 있습니까?
- 17. Leiningen의 대화 형 모드에서 어떻게 다시 시작할 수 있습니까?
- 18. QProcess가 작동하지 않아 다시 시작할 수 없음
- 19. FAILED 셀러리 작업을 다시 시작할 수 있습니까?
- 20. 신호로 C에서 프로세스를 Kiling하기
- 21. AVAudioRecorder - 사용자가 녹음을 중단 한 후 녹음을 계속 한 다음 응용 프로그램을 종료 한 다음 다시 엽니 다.
- 22. 서비스를 다시 시작할 수 없습니다.
- 23. 타이머 이벤트가 발생할 때 Windows 서비스에서 프로세스를 시작할 수 있습니까?
- 24. MDI에서 어떻게 마우스 이벤트를 시작할 수 있습니까?
- 25. 어떻게 Emacs + fcsh + Flex3를 시작할 수 있습니까?
- 26. 어떻게 bash에서 Capistrano를 시작할 수 있습니까?
- 27. NetBeans + xdebug : 디버거를 시작할 때마다 PHP 세션을 어떻게 다시 시작할 수 있습니까?
- 28. NetBeans에서 실행중인 Maven 빌드를 어떻게 종료 할 수 있습니까?
- 29. iPhone : 빨리 앱을 종료 한 다음 다시 시작하면 마지막 화면이 검은 색으로 표시되고 다시 시작됩니다.
- 30. 어떻게 코드를 다음 한
에 내가 강력하게이 일을 방지하기 위해 추천 할 것입니다. Microsoft 제품이 항상 종료하고 다시 시작하도록 요청하는 방법에 유의하십시오. 그래서 ... –
나는 무슨 일이 일어나고 있는지 이해합니다. 레지스트리와 탐색기를 다시 시작해야만 자동 실행 설정이 변경됩니다. – Malfist