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월 27일 화요일
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 );
}
}
{
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
피드 구독하기:
글 (Atom)