윈도우 예외 처리에 대한 정리 개요 윈도우에서 사용가능한 예외 처리로는 C++ 예외 처리와, SEH (Structured Exception Handling) 이 있습니다. 일반적으로 SEH(Structured Exception Handling)이라고 말하면 Windows 자체적으로 지원하는 구조적 예외 처리를 의미합니다. (관련 키워드 : __try, __except, __finally, __leave) 그리고 C++ Exception Handling (이하 C++ EH) 라 하면 C++ 에서 정의하고 있는 구조적 예외 처리를 의미합니다. (관련 키워드 : try, catch, throw) 두 예외 처리 방식에 대해 간단히 설명드리겠습니다. SEH 사용 예제 __try { int a = 500; int ..
char* GetStr() { static char szStr[] = "Hello"; return szStr; } void PrintStr(char **str) { printf("%s",*str); } int main(int argc, char **arv) { PrintStr(&GetStr()); return 0; } 위 코드는 아래와 같은 컴파일 에러를 발생시킨다. error C2102: '&' requires l-value 컴파일러의 에러는, l-value. 즉, 어딘가에 저장된 값에만 주소 연산자를 사용할 수 있다는 말이다. 내가 이 코드를 작성한 의도는 char형 포인터의 포인터 (이중 포인터)를 매개 변수로 받는 PrintStr함수의 매개변수로, char형 포인터를 반환하는 GetStr함수의 반..
출처 : http://aronze.egloos.com/213805 boost.org 에 있는 boost library 목록 정리 * generic 을 옴기는 과정에서 그냥 일반화라고 적었는데요, specialize 와 마찬가지로 template 관련 책을 보시지 않으면 잘 이해가 되지 않을 것입니다. 보통 객체지향 프로그래밍과 대비되는 말로 template 을 사용한 디자인을 일반화 프로그래밍이라고 하며, 일반화로 디자인된 객체를 실제 객체로 매칭시켜서 특화시킨 것을 template specialize 라고 합니다. * stl 도 마찬가지지만 boost 는 고수준의 template 코딩 테크닉이 함축되어 있어 사용 혹은 구현 소스를 보실 때 혼동이 많으실 겁니다. 국내에 관련하여 빨간책 시리즈가 나와 있..
일반적으로 다양한 형태의 포인터를 담기 위해 사용하는 방법 중에 주로 사용되는 방식은 두 방식입니다. 첫번째로 void *로 담는 방법과, 두번째로 상위 클래스를 두고 해당 클래스를 상속 받고, 상위 클래스 포인터로 관리하는 방법이 있죠. void*로 담는 방식의 단점은, 원본 포인터형이 아닌 다른 포인터형으로 캐스팅 하는 실수를 방지하기 어려운 문제가 있습니다. 상위 클래스 포인터로 다루는 방식은, 상속이 가능한 자료구조에만 사용 가능하다는 점과, 불필요한 상속을 유발하는 경우도 발생한다는 문제가 있습니다. 주로 포인터 변환은 콜백에서 많이 이루어지는데요, 제대로된 변환을 시도하느냐 그렇지 않느냐에 따라 변환 성공 여부를 반환해준다면 좋겠죠? 이에 대한 대안으로 AnyPtr이라는 것이 있습니다. 포인터..
pdb를 배포하는 것은 너무나 쉽게 리버싱을 허용하는 것이기 때문에, 조금이라도 리버싱을 어렵게 하기 위해선 exe 파일만 배포해야 합니다. 보통 서버의 경우 디버깅 정보를 매칭 시키는 수단으로 pdb도 바이너리와 같이 두기도 하는데요, 이렇게 하는 것에는 장단점이 있기에 이에 대한 코멘트는 생략하겠습니다. pdb가 없을때와 있을때 VS2005를 통한 덤프 확인시에 어떻게 다른지 보여드리겠습니다. 정상적으로 매칭되는 pdb 파일이 존재할 때 남은 덤프 파일의 콜스택과 스레드 소스 코드 매칭 정보. pdb 파일이 존재하지 않을때 남은 덤프 파일의 콜스택과 스레드. 이렇게 차이가 납니다. 실제로 pdb 파일이 없을 시에는 어느 함수에서 크래시가 났는지 확인하기 매우 어렵죠. 위에 크래시 난 곳의 주소를 보시..
Visual C++로 프로젝트를 작성시, 예제 프로그램을 작성해야 될일이 종종 있습니다. 특히 특정 라이브러리를 사용하는 프로젝트 생성시에는 같은 작업을 반복 해주어야 합니다. 저같은 귀차니스트에게는, 같은 작업 반복은 너무나도 짜증나는 일입니다. 코드 생성기가 괜히 있나요~ 자동화를 위한 시간 투자는 추후에 편해지기 위한(게을러 지기 위한) 노력입니다. 이를 위해 Custom Wizard라는 것을 VS에서는 제공해주고 있습니다. 그 중에서도 제가 자주 사용하는 VS2005를 바탕으로 설명 드리겠습니다. Custom Wizard를 통해서 정해진 옵션의 project 파일 및 소스 코드를 생성하는 것은 밑에 글을 참고하시면 됩니다. Create a Visual C++ Wizard for Visual Stu..
class CObject { public: CObject(int nKey) : m_nKey(nKey) { } virtual ~CObject() { } DWORD Key() { return m_nKey; } private: int m_nKey; }; class CChild : public CObject { public: CChild(int nKey) : CObject(nKey) { memcpy(m_szData, 0, sizeof(m_szData)); } void Set(char* pData) { strncpy_s(m_szData, pData, sizeof(m_szData)); m_szData[DATA_SIZE - 1] = 0; } char* Data() { return m_szData; } private:..
Visual C++ 프로젝트를 만들 때 새 솔루션을 만들거나 솔루션에 프로젝트를 추가할 수 있습니다. 하나의 솔루션에 포함된 여러 프로젝트를 사용하여 중요한 응용 프로그램을 개발하는 경우가 많습니다. 프로젝트는 보통 EXE 또는 DLL 중 하나를 생성합니다. 프로젝트는 서로 종속성을 가질 수 있습니다. Visual C++ 환경에서는 프로젝트 내부의 종속성 및 프로젝트 간의 종속성을 모두 확인합니다. 각 프로젝트에는 핵심 소스 코드가 있으며 프로젝트 종류에 따라 프로젝트의 여러 측면을 포함하는 여러 종류의 파일이 있습니다. 어떤 내용이 포함된 파일인지는 파일의 확장명을 통해 식별할 수 있습니다. Visual Studio 개발 환경에서는 파일 확장명을 기반으로, 빌드하는 동안 해당 파일 내용을 어떻게 처리할..
- Total
- Today
- Yesterday
- 조엘 온 소프트웨어
- perfmon
- RoR
- Rails
- SQLite Spy
- EzShortcut
- 엘키
- EasyExec
- CppSQLite
- 디버깅
- 루비 온 레일즈
- MS-SQL
- ftp
- NDC2013
- 루비
- svn
- ruby
- 멀티스레드
- 디자인 패턴
- 바로가기 프로그램
- Ruby on Rails
- 리버스 엔지니어링
- c언어
- SDL
- TraceRoute
- 게임개발포에버
- 게임데브포에버
- 좋은 프로그래머
- 임백준
- TDD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |