2015년 1월 27일 화요일

[MFC] 메모리 누수 확인

1. 클래스 파일 상단에 표시
#ifdef _DEBUG
#define new
 DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

2. 부분 디버깅
1) stdAfx.h에 추가
#include <crtdbg.h>
2) 메모리 확장 다음 delete 다음 _CrtDumpMemoryLeaks();
3) 발견된 번호로 _CrtSetBreakAlloc(149); 앞에서 찾기

2015년 1월 15일 목요일

Sleep 대신 Wait

void CNumberGameDlg::Wait(DWORD dwMillisecond)

{

MSG msg;

DWORD dwStart;

dwStart = GetTickCount();

while(GetTickCount() - dwStart < dwMillisecond)

{

while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

}

2015년 1월 6일 화요일

[MFC] 프로세스 강제종료


void ExitProcess(CString strTargetProcName, DWORD dwExceptProcId)
{
    DWORD aProcesses[1024]={0,}, cbNeeded, cProcesses;
    unsigned int i = 0;

    //실행중인 프로세스를 모두 구한다
    if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded))
        return;

    //실행중인 프로세스의 개수를 구한다
    cProcesses = cbNeeded / sizeof(DWORD);
    //각 프로세스에 대한 이름 및 프로세스 아이디를 구하고 타겟 프로세스를 강제로 종료시킨다
    for ( i = 0; i < cProcesses; i++ )
    {
        TCHAR szProcessName[MAX_PATH] = _T("unknown");
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i] );

        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;

            if (EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded))
                GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)); //프로세스 이름을 구한다(szProcessName)
        }

        BOOL bRet;
        CString strComp = szProcessName;
        //실행중인 프로세스(strComp)와 죽이려는 프로세스(strTargetProcName) 이름을 비교하여 같으면 해당 프로세스 종료
        //단 실행중인 나 자신은 죽이려는 프로세스에서 제외시킨다
        if((strComp.MakeLower() == strTargetProcName.MakeLower()) && (aProcesses[i] != dwExceptProcId))
        {
            HANDLE hKillProc = OpenProcess(PROCESS_TERMINATE, FALSE, aProcesses[i]);

            if(hKillProc != NULL)
            {
                DWORD ExitCode = 0;

                GetExitCodeProcess( hKillProc, &ExitCode );
                bRet = TerminateProcess(hKillProc, ExitCode );
                if( bRet )
                    WaitForSingleObject(hKillProc, INFINITE);

                CloseHandle(hKillProc);
            }
        }
        CloseHandle( hProcess );
    }
}
http://blog.daum.net/odega/21


http://blog.daum.net/odega/21