통계 위젯 (화이트)

231495
8881
2514300

저작권

Do not be afraid to fail. Be afraid not to try. Pain is temporary, suck is forever. Keep it small and simple.

카카오 광고







VC++ 프로그래밍 관련 잡다한 정보 몇가지.. by 미친병아리

사내 게시판에 올렸던 내용중 모아둘만한 것들을 모두 내 블로그에 옮겨본다.. 왜냐면 여기에 모아두는게 더 찾기 편하니까.. 여러 게시판에 흩어져 있는 정보들은 오히려 더 검색이 힘든 단점이 있는 것 같다.. 왜 Microsoft Exchange 서버는 게시판 통합검색은 지원을 안하는지 모르겠다.. 흐흐.. 어쩜 우리가 사용하는게 5.5라서 그런지도 모른다.. 시대에 맞게 회사에서도 Exchange 서버를 최신 버젼으로 업그레이드 했어야 하는건데.. 냠냠..

지뢰찾기 프로그램 해킹??
이건 C# 코드이긴 하지만, 재미나게 읽은 내용이라 같이.. 지뢰찾기 프로그램의 메모리를 덤프해서 지뢰가 있는 곳을 보여주는 프로그램.. Minesweeper, Behind the scenes 나중에 나도 리버스 엔지니어링을 취미삼아 해보게 되면 참조하려고.. 참 신기하다 어떻게 그 위치가 지뢰 정보인줄 알았을까.. 어셈블리를 공부해야 하는 이유가 또하나 늘어나는 순간이기도 하다..

SEH 처리용 클래스
누메가, 바운즈체커로 유명한 개발자라 아는 사람들이 많을 거다.. Matt Pietrek의 멋진 클래스, 오래전부터 MSJ에 기고한 글들도 많기로도 유명한데 97년도에 기고한 글중에 참 유용한 클래스가 있었다.. 좀 더 일찍 알았으면 더 좋았으련만.. 프로그램이 비정상 종료되었을때의 콜스택을 덤프해준다.. 빌드시 map 파일을 만들어뒀다면 어디서 죽었는지 비교적 쉽게 찾아볼 수 있다.. 버그 잡는데 유용하다.. 특히 릴리즈 후 특정상황에서만 죽는 버그..
다른 용도로도 활용될 수 있는데, 클래스를 조금 수정하면 죽은 프로그램을 계속 재실행 시킬 수 있다.. IE 처럼.. 서버 프로그램의 경우는 유용할 수도 있다..

MFC DLL Ordinal 확인하기
우리 함수 내부에서 죽은 경우는 map 파일을 사용하여 함수 번지수를 확인해볼 수 있는데 MFC DLL 등에서 죽은 경우 좀 난감한 경우가 있다.. 다른 DLL들은 모르겠지만, MFC DLL의 경우는 다음과 같은 방법으로 확인이 가능..
VC++ 6.0의 경우
C:Program FilesMicrosoft Visual StudioVC98MFCSRCIntel
폴더에 보면 mfc42.def 라는 파일이 있음.

VC++ 7.1의 경우
C:Program FilesMicrosoft Visual Studio .NET 2003Vc7atlmfc
srcmfcintel (음.. VC++ .NET은 ATL과 MFC가 합쳐졌나 보군)
mfc71.def 파일을 보면됨.
위의 파일을 열어 ordinal 번호를 검색해보면 함수명이 뭔지 알 수 있음. 파일은 디버그용, 유니코드용 각각 조합별로 존재하니 적절한 것을 찾아보자.
바로 위에서 소개한 "SEH 처리용 클래스"를 사용할때도 필요한 경우가 많다..
물론 최상의 경우는 이런거 찾아보게되는 상황을 만들지 않는게 짱이다.. 버그 없는 프로그램 개발.. 인간이라 실수를 할 수는 있겠지만, 충분히 줄일 수 있을 것이다..

VC++ 6.0 STL의 버그픽스
템플릿을 많이 사용하는 C++ 개발자들에게는 VC++ .NET 이전 버젼들은 C++ 컴파일러도 아니다라고 할 정도로 표준 C++을 제대로 지원 못하기로 유명한데, 그나마 이 버그들을 직접 수정하면 좀 더 쓸만해진다.. 뭐, 여전히 부족하긴 하지만.. 제대로 쓰려면 VC++ .NET 2003을 사용해야 한다.. Fixes for Library Bugs in VC++ V5.0/V6.0
Microsoft는 도대체 왜 서비스팩에 이런건 포함 안시키는가 모르겠다.. 최신 서비스팩을 설치했어도 이 버그픽스는 직접 해야 한다.. 생각보다 노가다다..

VC++ 6의 리모트 디버깅 활용하기
사용해보면 무척 편리한데 의외로 모르는 사람들이 많다.. 특정 환경에서 이상하게 동작하는 경우 재현이 힘들면 그 PC에서 직접 디버깅을.. 환경 세팅이 그다지 어렵지 않으니, 재현시키려고 고생하는 것 보다 경제적이다..
Remote Debugging in MSVC++ 6.0 - Step by step in the OnPaint message handler
간혹, 어떤 사람들은 리모트 디버깅이 VS .NET 부터나 가능한 것으로 아는 경우가 있는데, 그렇지 않음.. VC++ 6부터 지원되던 기능임..

재미난 템플릿 클래스, 하위 클래스인지 여부 판별
누가 작성했는지는 몰라도, 오.. 정말 멋진 코드입니다.. 놀라운 창의력..
#include <iostream>

template<typename Derived, typename Base>
class IsDerivedFrom
{
    class No
    {
    };

    class Yes
    {
        No no[2];
    };

    static Yes Test(Base*);    // 선언만..구현은 필요없음
    static No Test(...);       // 역시 마찬가지

public:
    enum { Is = sizeof(Test(static_cast<Derived*>(0))) == 
        sizeof(Yes) };
};

class A
{
};

class B: public A
{
    int a;
};

class D
{
};

void main()
{
    IsDerivedFrom<B,A> p1;
    IsDerivedFrom<D,A> p2;

    std::cout << p1.Is << std::endl;
    std::cout << p2.Is << std::endl;

    getchar();
}
누구도 생각지 못한 이런 생각들을 하는거 보면, 정말 창의력이 필요하다는 생각이 든다.. 창의력은 두고 두고 보답한다는데 나도 씽크빅 같은 것으로 다시 공부를 시작해 봐야하나..

C++에서 사용하는 캐스팅 연산자
C++의 새로운 캐스팅 연산자들이 등장하게된 이유를 자세히 설명해준 글.. 두번째 글은 C++의 창시자 비얀 스트로스트럽의 글인데.. 좀 짧다..
Casting in C++: Bringing Safety and Smartness to Your Programs
What good is static_cast?
음.. 생각보다 읽기 힘든 내용이다.. 아무래도 내 C++ 공력이 딸려서 인듯.. 이해하기가 힘들다.. 난 쉽고 친절한 설명이 좋은데.. 흐흐흐..

헝가리언 표기법이 C++에서 좋지 않은 이유
이제 헝가리언 표기법은 C와 Win32 API로 프로그래밍을 하던 시대의 유물로 남는가.. 하긴 알고보면 헝가리언 표기법은 챨스시모니가 Microsoft에 입사하기도 전에 만든 것 같은데.. 무자게 오래된 관행이긴 하다..
Conversations: Hungarian wartHogs
아직까진 내게도 더 편하긴 한데, 자바나 C# 같은데를 봐도 굳이 그럴 필요 없어 보이기도 하고.. 암튼 C++에서는 템플릿 때문에 별로라는 이야기인것 같음..

auto_ptr에 관련된 읽을거리
사실 난 그간 auto_ptr을 잘 사용하지 않아 왔기 때문에 별로 관심이 없었다.. 하지만 주위에서 그래도 쓰는게 훨 좋다는 이야기를 하도 많이 들어서..
Using auto_ptr Effectively
GotW #25: SPECIAL EDITION: auto_ptr
GotW #42: Using auto_ptr
GotW #56: Exception-Safe Function Calls
GotW #62: Smart Pointer Members
Exceptional C++ - More auto_ptr: auto_ptr and Exception Safety
Conversations #1: Re-membering auto_ptr
뉴스그룹에서 이런 저런 이야기 나누며 나온 링크들을 모조리 모아둔 것.. 이중 몇몇 내용들은 아마 Herb Sutter의 책으로도 소개되었을거다..

Template Metaprograms
오.. 아주 재미난 코드입니다.. (관련자료 보기)
// Template Metaprograms
template < int N >
class Factorial
{
public:
    enum { value = N * Factorial < N-1 >::value };
};

class Factorial < 1 >
{
public:
    enum { value = 1 };
};

int main(int argc, char* argv[])
{
    std::cout << Factorial < 10 >.value << std::endl;
    return 0;
}
실행시간이 아닌 컴파일 타임에 재귀호출이 일어나네요.. 마치 인터프리터처럼.. 후후.. 템플릿 전문화를 사용하여 1! 예외처리를 했구요..

내 소스코드가 C++ 표준에 맞는지 궁금하다면
여기에서 확인해보자.. 간편히 확인 가능하다..

C++을 안다는 것은
뉴스그룹에서 읽었던 재미난 글을 옮겨보자..
"사람의 언어처럼, C++ 언어를 안다는 것은 단지 문법과 규칙을 안다는 것을 뜻하지는 않는다. '관용구'도 알아야 한다."

"As with spoken languages, there is more to knowing the C++ language than just knowing the grammar and the rules. You must know the idioms."
- Jim Hyslop and Herb Sutter, "Virtually Yours"

이런 글들을 읽으면서 난 아직도 멀었다는 생각이 드는건, 아직 경력과 경험이 더 필요하다는 것이겠지.. 갈길은 여전히 멀고도 멀다.. 흐흐흐.. 그러나, 뽈레뽈레.. 쿠쿠쿠..

덧글

  • choissi 2004/01/26 04:12 #

    저는 Smart Pointers 관련 자료를 정리 해두었는데,
    http://www.ezdoum.com/stories.php?story=02/04/30/2036878
    미친병아리님 auto_ptr관련 내용을 퍼값니다.

  • 루저 2004/01/26 19:09 #

    망할 STL 때문에 VS.NET으로 옮겨 갈까 한참을 고민했지만, 단축키가 바뀌고, 클래스 위저드가 없어진 것 까닭에 아직도 VS6를 쓴다지요. 언젠가는 바꿔야 할 텐데...
  • kindlion 2004/01/27 02:55 #

    좋은 내용인듯...
    지뢰찾기 같은 것은 평소에 해보고 싶었던 것들인데...
    ㅋㅋㅋ 재밌을꺼 같네요~~~
    빨리 이정도의 실력을 쌓아야....^^
  • 이호영 2004/01/27 09:45 # 삭제

    아아~ 고수에의 길!
  • 狂風 2004/01/27 17:08 #

    우쓰.. 모르는게 많네요. 감사~ 아니 퍼갈까..
  • 조병완 2004/01/28 11:46 # 삭제

    처음으로 글 남기는것 같네요.
    지뢰찾기 리버싱을 하는 이야기가 나와서 말인데요.
    제가 가끔 취미생활로 크랙을 공부하고 있는데요.
    IDA Pro를 이용해서 리버스 엔지니어링 세계로 한번 빠져보세요 정말 잘 만들어진 쉽게 분석 가능하게 만들어주는 프로그램이예요... 소프트아이스에 버금가는...
    언제 제 홈페이지에 이와 관련된 정리를 좀 해야하겠는데...
    저는 왜이리 정리가 잘 안되는지 ㅜ.ㅡ
  • 99koRn 2004/01/28 20:03 #

    좋은 정보 잘봤습니다. 뭐 아직 멀었구나 싶습니다만..머리에서 정리가 잘 안됨 -_-;
    오늘 깜짝놀랬습니다.데브피아 온라인세미나를 자주는 아니지만 아주 가끔은 이용하는 편인데 .NET Framework관련 세미나를 보다가 낯이 익은 사람같아서 이름을 보니 미병님이더군요.정작 본명은 잘 몰르고 있었습니다만..-_-a
    뭐 세미나도 잘보고 좋은 정보 감사합니다
  • 미친병아리 2004/02/14 18:13 #

    choissi님 : 핫.. 좋은 정보 감솨.. 네.. 얼마든지 퍼가셔도 됩니다..

    루저님 : 흐흐.. 저두 아직까지는 VC++ 6.0으로..

    kindlion님 : 네.. 지뢰찾기 기사는 참 재미나죠?

    이호영님 : 걍, 살다 되면 좋고 안되면 말고.. 고수가 인생의 목표는 아니니..

    狂風님 : 네.. 푹푹 퍼가세여~

    조병완님 : 자주 놀러오셔요~ 크랙.. 재미난 분야죠.. IDA Pro라.. 함 구경해봐야겠네요.. 근데, 소프트아이스도 전혀 사용할 줄을 몰라서리.. 흐흐..

    99koRn님 : 헉.. 거, 엄청 벅벅대며 제가 첨으로 많은 사람 앞에서 떠들어본건데.. 데브피아에 아직도 올라가 있는가 보군요.. 흐흐..
  • 2004/02/26 11:47 # 삭제

    좋은 정보 감사합니다. :)
  • 미친병아리 2004/02/28 20:27 #

    곤님 : 네.. 반갑습니다.. 자주 놀러오세여~
  • CN 2005/04/06 14:49 # 삭제

    Modern C++ Design의 Andrei를 볼때마다 어떻게 저런 코드를 짜지? 란 생각이 들더군요. 템플릿을 잘했으면 좋겠습니다. ㅜㅜ
  • 볼세르크 2005/04/07 10:12 # 삭제

    Factorial 소스 GCC 버젼으로 고쳤습니다.

    #include <iostream>
    using namespace std;

    template < int N >
    class Factorial
    {
    public:
    enum { value = N * Factorial < N-1 >::value };
    };

    template <>
    class Factorial < 1 >
    {
    public:
    enum { value = 1 };
    };



    int main(int argc, char* argv[])
    {
    std::cout << Factorial < 10 >::value << std::endl;
    system("PAUSE");
    return 0;
    }
  • htna 2005/04/08 00:57 #

    좋은글 읽구갑니다. 일부 퍼갑니다. *^^*
  • 미친병아리 2005/04/23 23:15 #

    CN님 : 네.. 정말 부럽지요.. C++ 전문가들 사이에서도 스타인데요..

    볼세르크님 : 좋은 정보 감사합니다..

    htna님 : 네.. 반갑습니다..
※ 로그인 사용자만 덧글을 남길 수 있습니다.

카카오 광고