#define D3DX_PI    ((FLOAT)  3.141592654f)

#define D3DXToRadian(degree)((degree) * (D3DX_PI / 180.f))

#define D3DXToDegree(radian)((radian) * (180.f / D3DX_PI))


// 원에 십자를 그었을때 ┾ 두꺼운 선이 각도 0도이고 시계방향으로 1도, 2도... 한바퀴 돌아 두꺼운 선직전까지 360도이다.

// 각도 = 기준 점, 확인 할 점

static float GetDirectionAngle( float x1, float y1, float x2, float y2 )

{

x2 -= x1;

y2 -= y1;


//float Angle = D3DXToDegree( atan2(y2, x2) );

float Angle = atan2(y2, x2) * 57.3f;


if( 0 > Angle )

Angle += 360;


return Angle;

}



링크


MiniDump.h


#pragma once

#include "dbghelp.h"


class Mini_Dump

{

public:

Mini_Dump(void);

static Mini_Dump *gpDumper;


protected:

static LONG WINAPI Handler(struct _EXCEPTION_POINTERS *pExceptionInfo);


_EXCEPTION_POINTERS *m_pExceptionInfo;

TCHAR m_szDumpPath[_MAX_PATH];

TCHAR m_szAppPath[_MAX_PATH];

TCHAR m_szAppBaseName[_MAX_PATH];

LONG  WriteMiniDump(_EXCEPTION_POINTERS *pExceptionInfo);


virtual void VSetDumpFileName(void);

virtual MINIDUMP_USER_STREAM_INFORMATION *VGetUserStreamArray() {return NULL;};

};



typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess,

DWORD dwPid,HANDLE hFile,MINIDUMP_TYPE DumpType,

CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,

CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,

CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);



MiniDump.cpp


#include <windows.h>

#include "MiniDump.h"

#include "assert.h"


Mini_Dump *Mini_Dump::gpDumper = NULL;


//// 클래스 생성 함수

Mini_Dump::Mini_Dump( void )

{

assert(!gpDumper);

if(!gpDumper)

{

::SetUnhandledExceptionFilter(Handler);

gpDumper = this;

}

}


//// 덤저장 핸들

LONG Mini_Dump::Handler(_EXCEPTION_POINTERS *pExceptionInfo)

{

LONG retvel = EXCEPTION_CONTINUE_SEARCH;

// 덤프 확인

if(!gpDumper)

{

return retvel;

}

// 텀프 저장

return gpDumper->WriteMiniDump(pExceptionInfo);

}


//// 덤프를 저장한다.

LONG Mini_Dump::WriteMiniDump(_EXCEPTION_POINTERS *pExceptionInfo)

{

LONG retvel = EXCEPTION_CONTINUE_SEARCH;

// 익셉션 포인터 저장

m_pExceptionInfo = pExceptionInfo;

// dbghelp.dll 찾기

HMODULE hDll = NULL;

TCHAR szDbgHelpPath[_MAX_PATH];

if(GetModuleFileName(NULL,m_szAppPath,_MAX_PATH))

{

TCHAR *pSlash = strrchr(m_szAppPath,'\\');

if(pSlash)

{

strcpy(m_szAppBaseName,pSlash +1);

*(pSlash+1) = 0;

}

strcpy(szDbgHelpPath,m_szAppPath);

strcat(szDbgHelpPath,"DBGHELP.DLL");

hDll = ::LoadLibrary(szDbgHelpPath);

}

if(hDll == NULL)

{

// DLL 다시 한번 찾기

hDll = ::LoadLibrary("DBGHELP.DLL");

}

TCHAR szResult[_MAX_PATH];

BOOL bResult;

if(hDll)

{

MINIDUMPWRITEDUMP pMiniDumpWriteDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll,"MiniDumpWriteDump");

if(pMiniDumpWriteDump)

{

// 덤프 파일 이름 설정

VSetDumpFileName();

// 덤프 파일 저장

HANDLE hFile = ::CreateFile(m_szDumpPath,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hFile != INVALID_HANDLE_VALUE)

{

_MINIDUMP_EXCEPTION_INFORMATION ExInfo;

ExInfo.ThreadId = ::GetCurrentThreadId();

ExInfo.ExceptionPointers = pExceptionInfo;

ExInfo.ClientPointers = NULL;

// 덤프 기록

BOOL bOK = pMiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),

hFile,MiniDumpNormal,&ExInfo,VGetUserStreamArray(),NULL);

if(bOK)

{

wsprintf(szResult,"");

bResult = false;

retvel = EXCEPTION_EXECUTE_HANDLER;

}

else

{

bResult = true;

}

::CloseHandle(hFile);

}

else

{

// 파일 생성 오류

bResult = true;

}

}

else

{

wsprintf(szResult,"DBGHELP.DLL 구버전 입니다.");

bResult = true;

}

}

else

{

wsprintf(szResult,"DBBHELP.DLL 없습니다.");

bResult = true;

}

TerminateProcess(GetCurrentProcess(),0);

return retvel;

}


//// 저장 덤프 파일의 풀 경로 설정

void Mini_Dump::VSetDumpFileName()

{

// 저장 파일 이름 설정

wsprintf(m_szDumpPath,"%s%s.dmp",m_szAppPath,m_szAppBaseName);

}


Main.cpp



#include "stdafx.h"


#include <Windows.h>

#include "MiniDump.h"


void (*g_pRandFunction[5])();


void OnTest1(void) 

int nRandValue = rand()%5;

g_pRandFunction[nRandValue]();

}


void OnTest2(void) 

int nRandValue = rand()%5;

g_pRandFunction[nRandValue]();

}


void OnTest3(void) 

{

int *p = NULL;

for( int i = 0; i < 20000; i++ )

{

p[i] = 100;

}

}

void OnTest4(void) 

{

int nRandValue = rand()%5;

g_pRandFunction[nRandValue]();

}


void OnTest5(void) 

int *p = NULL;

for( int i = 0; i < 1000; i++ )

{

p[i] = 100;

}

}


int _tmain(int argc, _TCHAR* argv[])

{

Mini_Dump::gpDumper = new Mini_Dump;


// 메모리 할당 실패 테스트

//char *pc1 = new char[1000000000];

//char *pc2 = new char[1000000000];

//char *pc3 = new char[1000000000];

//char *pc4 = new char[0x7fffffff];


g_pRandFunction[0] = OnTest1;

g_pRandFunction[1] = OnTest2;

g_pRandFunction[2] = OnTest3;

g_pRandFunction[3] = OnTest4;

g_pRandFunction[4] = OnTest5;


srand(GetTickCount());

int nRandValue = rand()%5;

g_pRandFunction[nRandValue]();


return 0;

}












_countof를 이용하면 정적으로 할당된 배열의 개수를 구 할 수 있다.


예제1>

int n[2];

int rt = _countof(n);

rt에는 2 가 입력된다.


하지만 이것을 포인터로 변환해 버리면 개수를 구 할 수 없다.


예제2>

int* p = n;

int rt2 = _countof(p);


컴파일 오류가 난다.


프로그래밍에 유용하게 쓰기는 힘들꺼 같다.


링크






표 G-1. 배치 파일 키워드/변수/연산자 와 그에 해당하는 쉘 동의어

배치 파일 연산자쉘 스크립트 동의어
%$명령어줄 매개변수 접두사
/-명령어 옵션 플래그
\/디렉토리 패스 구분자
===(같음) 문자열 비교 테스트
!==!!=(다름) 문자열 비교 테스트
||파이프
@set +v현재 명령어를 에코하지 말 것
**파일명 "와일드 카드"
>>파일 재지향(덮어 쓰기)
>>>>파일 재지향(덧붙여 쓰기)
<<표준입력 재지향
%VAR%$VAR환경 변수
REM#주석
NOT!뒤에 나오는 테스트 부정
NUL/dev/null명령어 출력을 없애기 위한 "블랙홀"
ECHOecho에코 (Bash 에는 옵션이 많이 있음)
ECHO.echo빈 줄 에코
ECHO OFFset +v다음에 나오는 명령어를 에코하지 말 것
FOR %%VAR IN (LIST) DOfor var in [list]; do"for" 루프
:LABEL없음 (필요치 않음)라벨
GOTO없음 (대신 함수를 씀)스크립트의 다른 곳으로 건너 뜀
PAUSEsleep일정 간격을 두고 잠시 대기
CHOICEcase 나 select메뉴 선택
IFifif-test
IF EXIST FILENAMEif [ -e filename ]파일이 존재하는지 확인
IF !%N==!if [ -z "$N" ]변경가능한 매개변수인 "N"이 없다면
CALLsource 나 . (도트 연산자)다른 스크립트를 "포함"
COMMAND /Csource 나 . (도트 연산자)다른 스크립트를 "포함"(CALL과 동일)
SETexport환경 변수를 세트
SHIFTshift명령어줄 변수 목록을 왼쪽으로 이동(shift)
SGN-lt or -gt(정수) 부호(sign)
ERRORLEVEL$?종료 상태
CONstdin"콘솔"(표준입력)
PRN/dev/lp0(일반적인) 프린터 디바이스
LP1/dev/lp0첫번째 프린터 디바이스
COM1/dev/ttyS0첫번째 시리얼 포트


표 G-2. 도스 명령어와 동일한 유닉스 명령어

도스 명령어동일한 유닉스 명령어효과
ASSIGNln파일이나 디렉토리를 링크
ATTRIBchmod파일 퍼미션 변경
CDcd디렉토리 변경
CHDIRcd디렉토리 변경
CLSclear스크린 지우기
COMPcmp or diff파일 비교
COPYcp파일 복사
Ctl-CCtl-C정지(시그널)
Ctl-ZCtl-DEOF (end-of-file)
DELrm파일 삭제
DELTREErm -rf디렉토리의 하위 디렉토리까지 포함해서 삭제
DIRls -l디렉토리 보이기
ERASErm파일 삭제
EXITexit현재 프로세스 종료
FCcomm, cmp파일 비교
FINDgrep파일안에서 문자열 찾기
MDmkdir디렉토리 생성
MKDIRmkdir디렉토리 생성
MOREmore텍스트 파일 쪽단위(paging) 필터
MOVEmv이동
PATH$PATH실행파일들의 경로
RENmv이름 바꾸기(이동)
RENAMEmv이름 바꾸기(이동)
RDrmdir디렉토리 삭제
RMDIRrmdir디렉토리 삭제
SORTsort파일 정렬
TIMEdate시스템 시간 보여주기
TYPEcat파일을 표준출력으로 출력
XCOPYcp(확장) 파일 복사


링크

#pragma once


class CCriticalSection2   

{   

private:   

CRITICAL_SECTION  m_cs;   

public:   

CCriticalSection2()   

{   

InitializeCriticalSection(&m_cs);   

}   

~CCriticalSection2()   

{   

DeleteCriticalSection(&m_cs);   

}   


inline void Enter() { EnterCriticalSection(&m_cs); }   

inline void Leave() { LeaveCriticalSection(&m_cs); }   

};   


template<class T>   

class CMultiThreadSync   

{   

friend class CThreadSync;   

private:   

static CCriticalSection2 m_Sync;   

public:   

class CThreadSync   

{   

public:   

CThreadSync()   

{   

T::m_Sync.Enter();   

}   

~CThreadSync()   

{   

T::m_Sync.Leave();     

}   

};   

};   


template<class T>   

CCriticalSection2 CMultiThreadSync<T>::m_Sync;


///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////

// 실제사용

// 

// class CMyThred : public CMultiThreadSync<CMyThred>   

// {   

// }   

// //구현부분   

// 

// void CMyThread()   

// {   

// CThreadSync sync;   

// //작업 수행   

// }  

// 


링크


#if !defined (__AutoDetectMemoryLeak_h__)

#define __AutoDetectMemoryLeak_h__


#if defined(_MSC_VER) && defined (_DEBUG)

#define _CRTDBG_MAP_ALLOC // 메모리 누수를 탐지하기 위해 선언 해주어야 한다.

#include <crtdbg.h>

#if !defined (_CONSOLE)

#include <cstdlib> // for Consol Application

#endif


class __AutoDetectMemoryLeak

{

public:

    __AutoDetectMemoryLeak ()

    {

        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | 

            _CRTDBG_LEAK_CHECK_DF);


        // Consol Application인 경우

#if defined (_CONSOLE)

        // Send all reports to STDOUT

        _CrtSetReportMode( _CRT_WARN,               _CRTDBG_MODE_FILE   );

        _CrtSetReportFile( _CRT_WARN,               _CRTDBG_FILE_STDOUT );

        _CrtSetReportMode( _CRT_ERROR,              _CRTDBG_MODE_FILE   );

        _CrtSetReportFile( _CRT_ERROR,              _CRTDBG_FILE_STDOUT );

        _CrtSetReportMode( _CRT_ASSERT,             _CRTDBG_MODE_FILE   );

        _CrtSetReportFile( _CRT_ASSERT,             _CRTDBG_FILE_STDOUT );



        /* new로 할당된 메모리에 누수가 있을 경우 소스상의 

        정확한 위치를 덤프해준다.

        *  ※ _AFXDLL을 사용할때는 자동으로 되지만 CONSOLE 

        모드에서 아래처럼

        * 재정의를 해주어야만 합니다.

        *    date: 2000-12-05

        */

#define DEBUG_NORMALBLOCK   new ( _NORMAL_BLOCK, __FILE__, __LINE__ )

#ifdef new

#undef new

#endif

#define new DEBUG_NORMALBLOCK


#else


        // Send all reports to DEBUG window

        _CrtSetReportMode( _CRT_WARN,   

            _CRTDBG_MODE_DEBUG  );

        _CrtSetReportMode( _CRT_ERROR,  

            _CRTDBG_MODE_DEBUG  );

        _CrtSetReportMode( _CRT_ASSERT, 

            _CRTDBG_MODE_DEBUG  );


#endif


#ifdef malloc

#undef malloc

#endif

        /*

        * malloc으로 할당된 메모리에 누수가 있을 경우 위치

        를 덤프

        * CONSOLE 모드일 경우 crtdbg.h에 malloc이 정의되어 

        있지만,

        * _AXFDLL 모드일 경우에는 약간 다른방식으로 덤프 하

        게된다.

        * date: 2001-01-30

        */

#define malloc(s) (_malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ ))

    }

};


// 몇 가지 초기화를 생성자를 통해 자동으로 해주기 위해 전역으로 선언한다.

static __AutoDetectMemoryLeak __autoDetectMemoryLeak;


#endif // if defined(_MSC_VER) && defined (_DEBUG)


#endif // __AutoDetectMemoryLeak_h__

메모리 누수


#if !defined (__AutoDetectMemoryLeak_h__)
#define __AutoDetectMemoryLeak_h__

#if defined(_MSC_VER) && defined (_DEBUG)
#define _CRTDBG_MAP_ALLOC // 메모리 누수를 탐지하기 위해 선언 해주어야 한다.
#include <crtdbg.h>
#if !defined (_CONSOLE)
#include <cstdlib> // for Consol Application
#endif

class __AutoDetectMemoryLeak
{
public:
    __AutoDetectMemoryLeak ()
    {
        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | 
            _CRTDBG_LEAK_CHECK_DF);

        // Consol Application인 경우
#if defined (_CONSOLE)
        // Send all reports to STDOUT
        _CrtSetReportMode( _CRT_WARN,   
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_WARN,   
            _CRTDBG_FILE_STDOUT );
        _CrtSetReportMode( _CRT_ERROR,  
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_ERROR,  
            _CRTDBG_FILE_STDOUT );
        _CrtSetReportMode( _CRT_ASSERT, 
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_ASSERT, 
            _CRTDBG_FILE_STDOUT );


        /* new로 할당된 메모리에 누수가 있을 경우 소스상의 
        정확한 위치를 덤프해준다.
        *  ※ _AFXDLL을 사용할때는 자동으로 되지만 CONSOLE 
        모드에서 아래처럼
        * 재정의를 해주어야만 합니다.
        *    date: 2000-12-05
        */

#define DEBUG_NORMALBLOCK   new ( _NORMAL_BLOCK, __FILE__, __LINE__ )
#ifdef new
#undef new
#endif
#define new DEBUG_NORMALBLOCK

#else

        // Send all reports to DEBUG window
        _CrtSetReportMode( _CRT_WARN,   
            _CRTDBG_MODE_DEBUG  );
        _CrtSetReportMode( _CRT_ERROR,  
            _CRTDBG_MODE_DEBUG  );
        _CrtSetReportMode( _CRT_ASSERT, 
            _CRTDBG_MODE_DEBUG  );

#endif

#ifdef malloc
#undef malloc
#endif
        /*
        * malloc으로 할당된 메모리에 누수가 있을 경우 위치
        를 덤프
        * CONSOLE 모드일 경우 crtdbg.h에 malloc이 정의되어 
        있지만,
        * _AXFDLL 모드일 경우에는 약간 다른방식으로 덤프 하
        게된다.
        * date: 2001-01-30
        */

#define malloc(s) (_malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ ))
    }
};

// 몇 가지 초기화를 생성자를 통해 자동으로 해주기 위해 전역으로 선언한다.
static __AutoDetectMemoryLeak __autoDetectMemoryLeak;

#endif // if defined(_MSC_VER) && defined (_DEBUG)

#endif // __AutoDetectMemoryLeak_h__


링크

시작 -> 제어판 -> 서버관리자 -> 기능 -> 기능 추가 -> 데스크톱 경험


참고

+ Recent posts