프로그램을 안정적으로 종료하기 위한 함수
BOOL SafeTerminateProcess(HANDLE hProcess, UINT uExitCode)
{
DWORD dwTID, dwCode, dwErr = 0;
HANDLE hProcessDup = INVALID_HANDLE_VALUE;
HANDLE hRT = NULL;
HINSTANCE hKernel = GetModuleHandle("Kernel32");
BOOL bSuccess = FALSE;
BOOL bDup = DuplicateHandle(GetCurrentProcess(),
hProcess,
GetCurrentProcess(),
&hProcessDup,
PROCESS_ALL_ACCESS,
FALSE,
0);
if ( GetExitCodeProcess((bDup) ? hProcessDup : hProcess, &dwCode)
&& (dwCode == STILL_ACTIVE) )
{
FARPROC pfnExitProc;
pfnExitProc = GetProcAddress(hKernel, "ExitProcess");
hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE)pfnExitProc,
(PVOID)uExitCode, 0, &dwTID);
if ( hRT == NULL ) dwErr = GetLastError();
}
else
{
dwErr = ERROR_PROCESS_ABORTED;
}
if ( hRT )
{
WaitForSingleObject((bDup) ? hProcessDup : hProcess, INFINITE);
CloseHandle(hRT);
bSuccess = TRUE;
}
if ( bDup )
CloseHandle(hProcessDup);
if ( !bSuccess )
SetLastError(dwErr);
return bSuccess;
}
'Programming > 3. MFC' 카테고리의 다른 글
| TRACE_X or DebugView (0) | 2022.12.02 |
|---|---|
| [MFC] Resource View – Guide line must specify type error (0) | 2022.12.02 |
| 소스 배포시 삭제할 파일 및 디렉토리 (0) | 2022.12.02 |
| 파일을 암호화 / 복호화 하기 (0) | 2022.12.01 |
| [API/MFC] 레지스트리 읽고 쓰는 함수 (0) | 2022.12.01 |