다음을 통해 공유


DLLHUSK 샘플: MFC 라이브러리 동적 링크

업데이트: 2007년 11월

DLLHUSK 샘플은 MFC 라이브러리를 동일한 클래스 라이브러리 코드를 공유하는 사용자 지정 DLL(동적 연결 라이브러리)과 응용 프로그램에 링크하므로 여러 응용 프로그램을 실행하는 데 필요한 전체 메모리가 줄어듭니다.

MFC를 동적으로 링크시키면 사용자 지정 DLL에서 응용 프로그램이 구현되는 부분에 다른 응용 프로그램 아키텍처도 사용할 수 있으며, 응용 프로그램과 사용자 지정 DLL 모두가 MFC DLL(Mfcxx.dll)을 공유합니다. 응용 프로그램과 프레임워크 기능을 공유하는 사용자 지정 DLL은 MFC 확장 DLL이라고 합니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

DLLHUSK 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 dllhusk.sln을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

DLLHUSK 솔루션은 Dllhusk.exe 응용 프로그램과 응용 프로그램이 동적으로 링크되는 두 개의 DLL(TESTDLL1.DLL 및 TESTDLL2.DLL)을 모두 빌드합니다. DLLHUSK는 런타임에 MFCxx.DLL이나 MFCxxD.DLL을 필요로 합니다. 이 DLL은 기본적으로 Windows 시스템 디렉터리에 설치됩니다.

DLLHUSK MFC 확장 DLL

DLLHUSK에서는 MFC 확장 DLL을 클래스 내보내기와 함께 보여 줍니다. DLL(Testdll1.dll 및 Testdll2.dll)의 C++ 클래스는 AFX_EXT_CLASS 매크로를 사용하여 내보내집니다. 첫 번째 MFC 확장 DLL(TESTDLL1)은 사용자 지정 DLL의 모든 C++ 클래스 인터페이스가 응용 프로그램에 의해 직접 액세스되는 것이 아니라 프레임워크에 의해서만 액세스되는 DLL입니다. 사용자 지정 DLL에서는 extern "C" 함수만 응용 프로그램에 노출시킵니다. 사용자 지정 DLL에서는 프레임워크 클래스에서 파생된 클래스의 함수를 내보낼 필요가 없습니다. 사용자 지정 DLL의 파생 클래스에 대한 프레임워크에서의 모든 호출은 C++ 가상 함수 메커니즘을 통해 확인됩니다.

두 번째 MFC 확장 DLL(TESTDLL2)은 사용자 지정 DLL의 일부 C++ 클래스 인터페이스가 응용 프로그램에 직접 노출되고 응용 프로그램에 의해 직접 액세스되는 DLL입니다.

Testdll1.dll

Testdll1.dll에서는 TEXT 문서 형식과 HELLO 문서 형식이라는 두 문서 형식 모두에 대해 DLLHUSK의 문서 및 뷰 클래스를 구현합니다. Dllhusk.exe는 MDI 프레임 창 클래스를 구현하고 프레임워크는 MDI(다중 문서 인터페이스) 자식 창 클래스인 CMDIChildWnd를 구현합니다. 두 문서 템플릿 개체는 CTextDoc, CMDIChildWndCEditView와 CDummyDoc, CMDIChildWnd 및 CHelloView 간의 연관을 구성합니다. 따라서 DLLHUSK에서는 프레임워크 정의 개체의 클래스가 응용 프로그램, 사용자 지정(MFC 확장) DLL 및 프레임워크의 Mfcxx.dll에 구현되어 있는 경우에도 프레임워크에서 프레임워크 정의 개체 간의 관계를 조정할 수 있음을 보여 줍니다.

TESTDLL1은 실제로 응용 프로그램 개체의 AddDocTemplate 멤버 함수를 두 번 호출하여 두 문서 템플릿 개체를 등록합니다. 이러한 작업은 TESTDLL1이 내보내는 유일한 함수인 TESTDLL1의 InitTestDLL1 함수 구현에서 수행됩니다. 이 함수는 extern "C"로 선언되므로 DLLHUSK 응용 프로그램에서는 이 함수를 독립 실행형 C 함수로 호출할 수 있습니다.

Dllhusk.cpp에 의해 #include로 추가된 Testdll1.h 헤더 파일에는 InitTestDLL1, 선언뿐만 아니라 TESTDLL1의 클래스 선언도 포함되어 있습니다. Dllhusk.cpp는 InitTestDLL1 함수만 직접 참조합니다. 그러나 간접적으로 DLLHUSK에서는 Testdll1.dll에 구현된 문서 및 뷰 클래스를 사용합니다.

Testdll2.dll

Testdll2.dll에서는 DLLHUSK의 CListOutputFrame 클래스를 구현합니다. 사용자가 바로 가기 메뉴를 사용하여 진단 명령을 선택하면 응용 프로그램에서는 CListOutputFrame 개체를 만든 다음 CListOutputFrame::AddString을 호출하여 목록 출력 창에 진단 메시지를 보냅니다.

CListOutputFrame의 모든 공용 멤버 함수는 Testdll2.def 파일에서 내보내집니다. 내보내기에는 AddString뿐만 아니라 공용 CListOutputFrame 생성자와 소멸자도 포함됩니다.

클래스 멤버 함수를 내보내는 MFC 확장 DLL은 C 함수만 내보내는 MFC 확장 DLL보다 구현하기가 어렵습니다. C++ 이름으로 데코레이팅된 함수 내보내기를 DLL의 .def 파일에 직접 추가해야 하기 때문에 특히 그렇습니다. 이러한 작업의 기술에 대한 자세한 내용은 DLL Version of MFC를 참조하십시오.

추가 DLLHUSK 기능

DLLHUSK에서는 다음 사항도 보여 줍니다.

  • 단일 응용 프로그램의 리소스를 Visual C++ 리소스 편집기에서 편집할 수 있도록 여러 .rc 파일로 분할

  • 두 개의 전역 진단 함수, AfxDoForAllClassesAfxDoForAllObjects 사용

  • CDynLinkLibrary 개체 열거

키워드

이 샘플에서는 다음의 키워드를 보여 줍니다.

AfxDoForAllClasses, AfxDoForAllObjects, AfxGetApp, AfxGetResourceHandle, AfxMessageBox, AfxSetResourceHandle, AfxThrowMemoryException, CCmdUI::SetCheck, CColorDialog::DoModal, CColorDialog::GetColor, CDC::DrawText, CDC::SetBkColor, CDC::SetTextColor, CDialogBar::Create, CDocTemplate::GetDocString, CEditView::SerializeRaw, CFrameWnd::LoadFrame, CListBox::AddString, CListBox::Create, CListBox::GetCount, CListBox::GetText, CListBox::GetTextLen, CListBox::ResetContent, CListBox::SetCurSel, CMDIChildWnd::Create, CMenu::GetSubMenu, CMenu::LoadMenu, CMenu::TrackPopupMenu, CObject::AssertValid, CObject::Dump, CObject::Serialize, CStatusBar::Create, CStatusBar::SetIndicators, CToolBar::Create, CToolBar::LoadBitmap, CToolBar::SetButtons, CView::OnDraw, CWinApp::AddDocTemplate, CWinApp::InitInstance, CWinApp::LoadStdProfileSettings, CWinApp::OnFileNew, CWinApp::OpenDocumentFile, CWnd::GetClientRect, CWnd::GetCurrentMessage, CWnd::GetFont, CWnd::Invalidate, CWnd::OnCreate, CWnd::OnNcRButtonDown, CWnd::OpenClipboard, CWnd::SetFont, CWnd::ShowWindow, CWnd::UpdateWindow, CloseClipboard, EmptyClipboard, GetModuleFileName, GetSysColor, GlobalAlloc, GlobalLock, LOWORD, RGB, SetClipboardData, lstrlen, wsprintf

참고:

이 샘플을 비롯한 일부 샘플은 Visual C++ 마법사, 라이브러리 및 컴파일러의 변경 내용을 반영하도록 수정되지 않았지만 해당 작업의 수행 방법을 보여 줍니다.

참고 항목

기타 리소스

MFC 샘플