분류 389

DLL - 함수 호출시 __declspec(dllimport)의 사용과 미사용간 코드생성 차이점

DLL - 함수 호출시 __declspec(dllimport)의 사용Level of Difficulty 1 2 3 DLL을 통해서 API를 제공하기 위해서 DLL(PE)의 Export Table에 함수를 나타내도록 __declspec(dllexport)지시자를 사용합니다.반면에 함수를 호출하는 쪽에서는 특별히 __declspec(dllimport)으로 정의된 함수원형을 사용하지 않아도 DLL에서 제공된 함수를 사용 할 수 있습니다.결론 부터 말씀드리면 DLL에서 제공되는 함수를 사용할 때에는 함수선언 앞에 __declspec(dllimport) 지시자를 사용할 것을 강력히 권합니다.대부분 DLL의 API는 헤더에서 다음과 같이 선언 되어있습니다.// API Export/Import Header#ifdef..

C, C++ 문법 2008.09.02

__declspec( selectany ) declarator

아래글을 요약하자면, 여러번 정의가 된 경우, 아무거나 하나 고른다... 헤더파일에 선언뿐 아니라 정의까지 넣는 경우 중복 문제로 컴파일이 되지 않는데 그런 경우 쓰면 좋다... 실제로 component의 작성시 헤더화일에 위 지시자를 쓰면서 guid 정의를 같이 하는 경우가 있다. extern "C" const GUID __declspec(selectany) LIBID_MYCTRLLib = {0xcd886b0a,0x2d92,0x40fe,{0xb0,0x1f,0x72,0x83,0x6c,0x14,0x3e,0xe2}}; extern "C" const GUID __declspec(selectany) CLSID_MyTest = {0x66483f99,0x21ff,0x45a0,{0xa5,0xcc,0x75,0xa2,0..

C, C++ 문법 2008.09.02

MFC의 구조

MFC의 구조Programing Tip/C/C++ Programing 2007/01/30 06:51 * 어플리케이션 구조 기본적인 프로그램을 제작할 때 필요한 기본 클래스는 다음 네가지이다. CWinApp, CDocument, CFrameWnd, CView 의 네가지인데 실질적으로 앞의 두 클래스는 화면에 보이지 않고 뒤의 두 클래스는 화면에 보이는 클래스로 구분된다. 윈도우 프로그램은 메시지를 통해 프로그램이 진행 되므로 기본적으로 메시지를 주고 받는 클래스가 필요한데 이것은 CObject에서 상속을 받는 클 래스인 CCmdTarget이다. CFrameWnd : 윈도우 외곽선, 타이틀, 윈도우 메뉴, 도구바, 상태창 등을 포함한 메인 윈도우. CView : 메인 윈도우 내부의 작은 윈도우, 기본적인 화..

MFC 2008.09.02

DEBUG_NEW 간단한 이해 윈도우 프로그래밍

CPP 파일에 DEBUG_NEW 활용하기! 프로그래밍 2005/06/28 18:30 http://blog.naver.com/l544/120014656793 이 포스트를 보낸곳 () 비주얼 C++에서 [MFC]를 사용하고 있을 때, CPP 파일 첫 부분에 다음과 같은 내용을 넣어두자! #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif 보통 MFC 프로젝트에 있지만 다른 곳에서 가져온 CPP 파일에서는 없으니까, 복사해 주면 유용하게 쓸 수 있다. 선언이 있고 없고의 차이는 다음과 같다; [없을 때] Detected memory leaks! Dumping objects -> {78} norm..

MFC 2008.09.02

MFC 객체간 통신 방법

MFC 객체간 통신 방법 (Programming/Windows Programming, 2007/06/26 14:59) 출처 : 데브피아 채상혁님(serapian) 자주쓰이는 MFC 객체간의 통신입니다. 외워쓰기에는 시간이 아깝고, 매번 찾으려면 귀찮았는데 한번에 모아놓으니 편리하네요.^^ [SDI 형태] 1. MainFrame 얻기 - CMainFrame *pFrame = (CmainFrame *) AfxGetMainWnd(); 2. App 포인터 얻기 - CTestApp *pApp = (CtestApp *) AfxGetApp(); 3. Document 포인터 얻기 - CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); CTestDoc *pDoc = (CTestD..

MFC 2008.09.02

RTTI의 이해

2007/02/13 22:53 RTTI의 이해 2007/02/13 22:53 in C/C++ RTTI는 Run-Time Type Information의 약자로써, 실행시간에 객체의 타입 정보를 얻게 하는 C++의 확장? 정도 이다. 자바나 C#의 경우에는 리플렉션의 축소판 정도라고 생각하면 되겠다. 우선은 RTTI를 위하여 구현해야 하는 기능을 보자. - 실행 시에 알려지지 않은 클래스의 이름과 크기를 얻을 수 있어야 한다. - 실행 시에 알려지지 않은 클래스를 동적으로 생성할 수 있어야 한다. 우선 실행 시에 클래스의 이름을 얻는 방법부터 보자. 이를 위해서는 딱 두가지의 처리만 해주면 된다. 1. 자신의 클래스의 이름을 저장하는 정적변수를 만든다. 2. 그 이름을 리턴하는 GetClassName()을..

MFC 2008.09.02

MFC 프로그램의 흐름 살펴보기 - 인터널

1. 예제 앞으로 MFC의 내부속으로 들어가 보기 위해 실제 예제 코드를 가지고 실험하게 될 것이다. Visual C++ 6.0 sp5 기반으로 설명할 것이며 아래 코드가 실험용으로 사용하게 될 예제이다. // Simple.hpp #include class CSimpleApp: public CWinApp { public: virtual BOOL InitInstance(); }; MFC를 이용하려면 afxwin.h는 반드시 포함시켜야 한다. CWinApp를 비롯한 MFC에서 제공하는 주요 클래스와 함수들의 프로토타입들이 정의, 또는 선언되어 있는 헤더 파일이다. CSimpleApp 클래스를 선언하면서 CWinApp를 상속받도록 했다. CWinApp는 application object라 해서 어플리케이션의 ..

MFC 2008.09.01

클래스 멤버 함수를 윈도우 프로시져로 등록하기 [3/3]

우선 클래스 멤버 함수를 윈도우 프로시져로 등록하는건 간단합니다.아래처럼 클래스 선언에서 함수명 앞에 static를 붙여주기면 하면 됩니다.class A{public:    HWND CreateEventWnd(HINSTANCE hInstance);    static LRESULT CALLBACK EventWndProc(HWND hWnd, UINT uMsg, WPARAM wParam,         LPARAM lParam);}멤버 함수들은 보이지 않게 인자 하나를 추가로 더 전달받게 되는데요.아시겠지만 this 포인터 입니다.이 this 포인터가 인자로 하나 더 붙기 때문에 윈도우 프로시져가 될 수 없습니다.그래서 this 포인터를 전달하기 않게 하기 위해 static 멤버로 만듭니다.  이렇게 하면 컴..

MFC 2008.09.01

클래스 맴버함수를 콜백함수로 사용하기 [2/3]

클래스 맴버함수를 콜백함수로 사용하기 (passing class member function as callback function) --------------------------------------------------- 이 문제는 윈도우즈 API 와 C++ 언어를 같이 사용할 때 부딪히는 문제이다. 콜백함수를 인자로 요구하는 API 에 클래스의 멤버함수를 넘겨 줄 수는 없는 것인가? 여기 그 해결의 가능성을 보여준다. --------------------------------------------------- 항상 고민해 왔던것. 마음속 깊은곳으로 부터, 나를 괴롭히던 문제. DLGPROC 형 파라메터에 클래스의 맴버함수를 넘겨줄수는 없는것인가. DialogBoxParam( hInst, MAKEIN..

MFC 2008.09.01