다음을 통해 공유


MFC의 DLL 버전을 TN033.

이 참고 mfcxx. Dll을 사용할 수 있습니다 및 MFCxxD.DLL (여기서 x는 MFC 버전 번호입니다) MFC 응용 프로그램과 확장 Dll에 공유 동적 연결 라이브러리 방법에 대해 설명 합니다.기본 Dll에 대 한 자세한 내용은 참조 하십시오. 를 사용 하 여 MFC DLL의 일부로.

이 기술 노트 Dll의 세 가지 측면에 설명합니다.고급 사용자를 위한 마지막 두 가지는 다음과 같습니다.

  • MFC 확장 DLL을 빌드하는

  • MFC의 DLL 버전을 사용 하 여 MFC 응용 프로그램을 빌드하는

  • MFC 동적 연결 라이브러리를 공유 하는 방법 구현

(이것 이라고 하는 기본 DLL) 비 MFC 응용 프로그램에서 사용할 수 있는 MFC를 사용 하 여 DLL을 빌드하는 데 관심이 있다면 참조 기술 참고 11.

Mfcxx. Dll 지원 개요: 용어 및 파일

기본 DLL: 일부 MFC 클래스를 사용 하 여 독립 실행형 DLL을 작성 하는 기본 DLL을 사용 합니다.응용 프로그램/d l L 경계 인터페이스 "C" 인터페이스 이며 클라이언트 응용 프로그램이 MFC 응용 프로그램이 없습니다.

이 버전의 MFC 1.0에서는 지원 DLL 지원입니다.에 설명 된 기술 참고 11 및 고급 개념 MFC 샘플 DLLScreenCap.

[!참고]

Visual C++ 버전 4.0에서의 용어는 USRDLL 오래 되어 서 정적으로 MFC에 링크 한 기본 DLL로 대체 되었습니다.동적으로 MFC에 링크 한 기본 DLL을 빌드할 수도 있습니다.

MFC 3.0과 위의 기본 Dll OLE 및 데이터베이스 클래스를 포함 하 여 모든 새 기능을 지원 합니다.

AFXDLL:이 MFC 라이브러리의 공유 버전으로 라고도 합니다.MFC 2.0에 추가 되는 새 DLL 지원입니다.MFC 라이브러리 여러 Dll (아래 설명 참조) 이며 클라이언트 응용 프로그램 또는 DLL을 필요로 하는 Dll을 동적으로 링크 합니다.응용 프로그램/d l L 경계 인터페이스는 C + + MFC 클래스 인터페이스.클라이언트 응용 프로그램에는 MFC 응용 프로그램 이어야 합니다.이 모든 MFC 3.0 기능 지원 (예외: 데이터베이스 클래스에 대해 유니코드를 지원 하지 않습니다).

[!참고]

Visual C++ 버전 4.0이이 형식의 DLL "확장명으로 DLL." 라고

이 참고 포함 MFC DLL을 전체를 참조할 Mfcxx.dll을 사용 합니다.

  • 디버그: MFCxxD.DLL (조합) 및 MFCSxxD.LIB (정적).

  • 릴리스: MFCxx.DLL (조합) 및 MFCSxx.LIB (정적)

  • 유니코드 디버그: MFCxxUD.DLL (조합) 및 MFCSxxD.LIB (정적).

  • 유니코드 릴리스: MFCxxU.DLL (조합) 및 MFCSxxU.LIB (정적)

[!참고]

해당 MFCSxx [U] [D]입니다.LIB 라이브러리 사용 됩니다 함께 MFC 공유 Dll입니다.이러한 라이브러리 응용 프로그램 또는 DLL에 정적으로 링크 해야 하는 코드를 포함 합니다.

해당 가져오기 라이브러리는 응용 프로그램 링크입니다.

  • 디버그: MFCxxD.LIB

  • 버전: MFCxx.LIB

  • 디버그 유니코드: MFCxxUD.LIB

  • 유니코드 버전: MFCxxU.LIB

"MFC 확장 DLL" Mfcxx.dll에 빌드된 DLL이 (또는 다른 MFC 공유 Dll).여기서는 MFC 구성 요소 아키텍처가 작동합니다.유용한 클래스는 MFC 클래스에서 파생 또는 다른 MFC 모양의 도구 키트를 건설 하는 경우 DLL에 배치할 수 있습니다.최고의 클라이언트 응용 프로그램과 마찬가지로 DLL Mfcxx.dll을 사용 합니다.잎을 재사용 가능한 클래스, 재사용 가능한 기본 클래스 및 클래스를 다시 사용할 수 있는 보기/문서를 허용 합니다.

장점과 단점

MFC의 공유 버전을 사용 해야 하는 이유?

  • 공유 라이브러리를 사용 하 여 (대부분의 MFC 라이브러리를 사용 하는 최소한의 응용 프로그램 10k 미만입니다) 작은 응용 프로그램에 발생할 수 있습니다.

  • MFC의 공유 버전을 MFC 확장 Dll 및 기본 Dll을 지원합니다.

  • 공유 MFC 라이브러리를 사용 하 여 응용 프로그램 빌드 MFC를 직접 링크할 필요가 없기 때문에 정적으로 링크 된 MFC 응용 프로그램을 구축 하는 보다 더 빠릅니다.특히에서 디버그 빌드 링커가 디버그 정보를 압축 해야-즉, 디버그 정보가 이미 들어 있는 DLL에 연결 하 여 하므로 응용 프로그램 내에 압축 해야 할 디버그 정보가 줄어듭니다.

이유는 MFC의 공유 버전을 사용 해야 합니다.

  • 공유 라이브러리를 사용 하는 응용 프로그램에 전달 해야 mfcxx. Dll (및 기타)를 제공 하는 라이브러리와 프로그램입니다.MFCxx.DLL 여러 Dll 처럼 자유롭게 재배포 가능 하지만 여전히 설치 프로그램에서 해당 DLL을 설치 해야 합니다.또한 프로그램과 MFC Dll에서 모두 사용 되는 C 런타임 라이브러리를 포함 하는 MSVCRTxx.DLL을 제공 해야 합니다.

MFC 확장 DLL을 작성 하는 방법

MFC 확장 DLL 클래스와 MFC 클래스의 기능을 보완 하기 작성 기능을 포함 하는 DLL입니다.MFC 확장 DLL은 공유 MFC Dll을 사용 하 여 같은 방식으로, 몇 가지 추가 고려 사항으로 응용 프로그램에서 사용:

  • 빌드 프로세스가 공유 MFC 라이브러리의 몇 가지 추가 컴파일러 및 링커 옵션을 사용 하는 응용 프로그램을 작성 하는 것과 유사 합니다.

  • MFC 확장 DLL에 없는 CWinApp-클래스를 파생 합니다.

  • MFC 확장 DLL은 특별 한 제공 해야 DllMain.응용 프로그램 마법사에서 제공 된 DllMain 수정할 수 있는 기능.

  • MFC 확장 DLL 일반적으로 작성 하는 초기화 루틴을 제공 합니다는 CDynLinkLibrary 확장 DLL 내보내기 하고자 하는 경우 CRuntimeClass응용 프로그램 리소스 또는 es.파생된 클래스의 CDynLinkLibrary 확장 DLL에서 응용 프로그램별 데이터를 유지 해야 하는 경우 사용할 수 있습니다.

이러한 고려 사항은 아래에서 자세히 설명 합니다.또한이 샘플을 MFC 고급 개념을 참조 하십시오 DLLHUSK 이 설명 하므로:

  • 공유 라이브러리를 사용 하 여 응용 프로그램을 구축 합니다.(DLLHUSK입니다.EXE 뿐 아니라 다른 Dll에는 MFC 라이브러리를 동적으로 링크 하는 MFC 응용 프로그램입니다.)

  • MFC 확장 DLL을 작성 합니다.(같은 특수 플래그가 있습니다 _AFXEXT 으로 확장 DLL을 빌드 사용)

  • MFC 확장 Dll의 두 가지 예입니다.하나 MFC 확장 DLL (TESTDLL1) 제한 내보낸 데이터로 및 전체 클래스 인터페이스 (TESTDLL2) 내보내기 프로그램의 기본 구조를 보여 줍니다.

클라이언트 응용 프로그램과 확장 Dll Mfcxx.dll의 동일한 버전을 사용 해야 합니다.규칙의 MFC DLL을 따르고 모두 디버그를 제공 해야 하 고 소매 (/ 릴리스) 확장 DLL의 버전입니다.이렇게 모두 디버그 버전과 일반 정품 버전의 응용 프로그램을 작성 하 고 적절 한 디버그 또는 정식 버전의 모든 Dll에 연결 하는 클라이언트 프로그램이 있습니다.

[!참고]

C + + 이름 변환 및 내보내기 문제 때문에 확장 DLL의 내보내기 목록이 다른 플랫폼에 대 한 같은 DLL의 디버그 버전과 일반 정품 버전 및 Dll 간에 다를 수 있습니다.소매 MFCxx.DLL 약 2000 개의 내보내는 진입점이. 디버그 MFCxxD.DLL 약 3000 개의 내보내는 진입점이.

hw85e4bb.collapse_all(ko-kr,VS.110).gif참고 메모리 관리

Mfcxx. Dll의 MFC의 공유 버전을 구현 절 "메모리 관리"이 기술 노트의 끝 부분을 설명 합니다.여기만 확장 DLL을 구현 하기 위해 알아야 하는 데 필요한 정보를 설명 합니다.

Mfcxx. Dll 및 클라이언트 응용 프로그램의 주소 공간에 로드 된 모든 확장 Dll에서 동일한 응용 프로그램 처럼 동일한 메모리 할당자, 리소스 로딩 및 기타 MFC "전역" 상태 사용 합니다.비 MFC DLL 라이브러리와 정적으로 MFC에 링크 하는 기본 Dll 정반대 수행 하 고 각 DLL 자체 메모리 풀을 할당 하도록 때문 상당한입니다.

확장 DLL이 메모리를 할당 하는 경우 다음 해당 메모리는 다른 응용 프로그램에서 할당 된 개체와 자유롭게 수 있습니다.또한 공유 MFC 라이브러리를 사용 하 여 응용 프로그램이 중단 되 면 운영 체제의 보호 기능은 해당 DLL을 공유는 다른 MFC 응용 프로그램의 무결성을 유지 합니다.

마찬가지로 다른 "전역" MFC 상태 리소스를 로드 하는 현재 실행 파일 처럼 클라이언트 응용 프로그램 및 모든 MFC 확장 Dll은 물론 사이 MFCxx.DLL 자체 또한 공유 됩니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif확장 DLL을 빌드

응용 프로그램 마법사를 사용 하 여 MFC 확장 DLL 프로젝트를 만들 수 및 해당 컴파일러 및 링커 설정을 자동으로 생성 됩니다.또한 생성 된는 DllMain 함수는 수정할 수 있습니다.

MFC 확장 DLL에 기존 프로젝트를 변환 하는 경우 MFC의 공유 버전을 사용 하 여 응용 프로그램 빌드에 대 한 표준 규칙을 시작 하 고 다음을 수행 합니다.

  • 추가 /D_AFXEXT 컴파일러 플래그입니다.프로젝트 속성 대화 상자에서 C/C++ 노드를 선택 합니다.다음 전처리기 범주를 선택 합니다.추가 _AFXEXT 에 정의 된 매크로 필드를 각 항목을 세미콜론으로 구분 합니다.

  • 제거는 /Gy 컴파일러 스위치.프로젝트 속성 대화 상자에서 C/C++ 노드를 선택 합니다.다음 코드 생성 범주를 선택 합니다."함수 수준 링크 사용" 옵션이 설정 되어 있지 않은지 확인 하십시오.이 링커에서 참조 되지 않은 기능을 제거 하지 않습니다 때문에 클래스 내보내려면 쉽게 됩니다.정적으로 DLL을 빌드하려면 원래 프로젝트를 사용 하는 경우 MFC에서 변경 링크를 [d] /MT 컴파일러 옵션에 /MD [d.

  • 내보내기는 라이브러리를 빌드하는 /DLL link 옵션.Win32 동적 연결 라이브러리를 대상 형식으로 지정 하는 새 대상을 만들 때 설정 됩니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif헤더 파일을 변경합니다.

확장의 목적은 DLL 일반적으로 해당 기능을 사용 하는 하나 이상의 응용 프로그램에 몇 가지 일반적인 기능을 내보내는 것입니다.이 클래스 및 클라이언트 응용 프로그램에 사용할 수 있는 전역 함수를 내보내는 것입니다.

이렇게 하려면 각 멤버 함수는 가져오기 또는 내보내기 적절 하 게 됨으로 표시 되었음이 되도록 해야 합니다.이 특별 선언 해야: __declspec (dllexport)__declspec (dllimport).클래스는 클라이언트 응용 프로그램에서 사용 하는 경우로 선언 되어야 할 __declspec (dllimport).확장 DLL 자체를 빌드할 때 해당 이름으로 선언 해야 __declspec (dllexport).로드 시 클라이언트 프로그램에 바인딩할 수 있도록 또한 함수 실제로, 내보내야 합니다.

전체 클래스를 내보내려면 사용 AFX_EXT_CLASS 클래스 정의입니다.이 매크로 프레임 워크에 의해 정의 됩니다 __declspec (dllexport)_AFXDLL_AFXEXT 이지만 정의 정의 __declspec (dllimport)_AFXEXT 정의 되지 않았습니다._AFXEXT위에서 설명한 대로 확장 DLL을 빌드할 때만 정의 됩니다.예를 들면 다음과 같습니다.

class AFX_EXT_CLASS CExampleExport : public CObject
{ ... class definition ... };

hw85e4bb.collapse_all(ko-kr,VS.110).gif전체 클래스를 내보내지 않는 경우

때로는 방금 개별 필요한 클래스의 멤버를 내보내려는 경우가 있습니다.예를 들어, CDialog 파생 클래스를 내보내는 경우 해당 생성자 및 DoModal 호출만 내보내야 하는 경우가 있습니다.해당 DLL을 사용 하 여 이러한 멤버를 내보낼 수 있습니다.하지만 DEF 파일을 사용할 수 있습니다 AFX_EXT_CLASS 에서 필요한 내보내기에 개별 구성원의 비슷하게.

예를 들면 다음과 같습니다.

class CExampleDialog : public CDialog
{
public:
   AFX_EXT_CLASS CExampleDialog();
   AFX_EXT_CLASS int DoModal();
   // rest of class definition
   .
   .
   .
};

클래스의 모든 멤버를 더 이상 내보내지 않으므로이 작업을 수행 하는 경우에 추가적인 문제를 실행할 수 없습니다.문제는 방식으로 해당 MFC 매크로 작업입니다.MFC의 일부 도우미 매크로에서는 실제로 데이터 멤버를 선언하거나 정의합니다.따라서 이러한 데이터 멤버도 DLL에서 내보내야 하도 해야 합니다.

예를 들어, 확장 DLL을 빌드할 때에는 다음과 같이 DECLARE_DYNAMIC 매크로가 정의됩니다.

#define DECLARE_DYNAMIC(class_name) \
protected: \
   static CRuntimeClass* PASCAL _GetBaseClass(); \
   public: \
   static AFX_DATA CRuntimeClass class##class_name; \
   virtual CRuntimeClass* GetRuntimeClass() const; \

시작 하는 줄 "정적 AFX_DATA" 정적 개체 클래스 내에 선언 됩니다.이 클래스를 올바르게 내보내고 클라이언트에서 런타임 정보에 액세스.이 정적 개체를 내보내야 할 EXE를.정적 개체는 AFX_DATA 한정자를 사용하여 선언되기 때문에 이 AFX_DATA를 DLL 빌드 시에는 **__declspec(dllexport)**으로 정의하고 클라이언트 실행 파일 빌드 시에는 **__declspec(dllimport)**으로 정의합니다.

위에서 설명한 것 처럼 AFX_EXT_CLASS 이미 이런이 방식으로 정의 됩니다.재정의 한 필요가 AFX_DATA 로 동일 하 게 AFX_EXT_CLASS 클래스 정의 주위.

예를 들면 다음과 같습니다.

   #undef  AFX_DATA
   #define AFX_DATA AFX_EXT_CLASS
   class CExampleView : public CView
   {
     DECLARE_DYNAMIC()
     // ... class definition ...
   };
   #undef  AFX_DATA
   #define AFX_DATA

항상 MFC를 사용 하 여 AFX_DATA 이 기술은 이러한 모든 시나리오에 사용할 수 있도록 해당 매크로 내에서 정의 하는 데이터 항목에 대 한 기호입니다.예를 들어,에 대 한 작동 하지 DECLARE_MESSAGE_MAP.

[!참고]

클래스에서 선택한 멤버만 내보내는 것이 아니라 전체 클래스를 내보내는 경우에는 정적 데이터 멤버가 자동으로 내보내집니다.

동일한 기술을 사용 하 여 자동으로 내보낼 수 있는 CArchive 추출 연산자를 사용 하는 클래스는 DECLARE_SERIALIMPLEMENT_SERIAL 매크로.대괄호 클래스 선언으로 아카이브 운영자 내보내기 (에 합니다.H 파일) 다음 코드를 사용 합니다.

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

<your class declarations here>

#undef AFX_API
#define AFX_API

hw85e4bb.collapse_all(ko-kr,VS.110).gif_AFXEXT의 제한 사항

사용할 수 있는 _AFXEXT 전처리기 기호를 확장 Dll 확장 Dll의 여러 레이어 하지 않은 만큼.사용자의 확장 DLL에 있는 클래스에서 호출 또는 파생되고 MFC 클래스에서 파생되는 확장 DLL이 있는 경우에는 모호성을 피하기 위해 사용자 고유의 전처리기 기호를 사용해야 합니다.

Win32에서는 모든 데이터를 명시적으로 __declspec(dllexport)(DLL에서 내보내는 경우) 및 __declspec(dllimport)(DLL에서 가져오는 경우)으로 선언해야 합니다._AFXEXT를 정의할 때 MFC 헤더에서 AFX_EXT_CLASS가 올바르게 정의되는지 확인합니다.

경우에 여러 계층, 기호 등 AFX_EXT_CLASS 확장 DLL 수 수 새 클래스를 내보낼 뿐만 아니라 이후 또 다른 확장 DLL에서 다른 클래스를 가져올 충분 하지 않습니다.이러한 문제를 해결 하려면와 DLL을 사용 하는 DLL을 빌드 있는지를 나타내는 특별 한 전처리기 기호를 사용 합니다.예를 들어, 두 개의 확장 Dll, A.DLL, B.DLL을 가정해 봅시다.각각 A.H와 B.H에서 일부 클래스를 각각 내보냅니다.B.DLL은 A.DLL의 클래스를 사용합니다.헤더 파일은 다음과 같습니다.

/* A.H */
#ifdef A_IMPL
   #define CLASS_DECL_A   __declspec(dllexport)
#else
   #define CLASS_DECL_A   __declspec(dllimport)
#endif

class CLASS_DECL_A CExampleA : public CObject
{ ... class definition ... };

/* B.H */
#ifdef B_IMPL
   #define CLASS_DECL_B   __declspec(dllexport)
#else
   #define CLASS_DECL_B   __declspec(dllimport)
#endif

class CLASS_DECL_B CExampleB : public CExampleA
{ ... class definition .. };

A.DLL이 빌드될 때 빌드할 수 /D A_IMPL 와 B.DLL이 빌드될 때에 내장 된 /D B_IMPL.각 DLL에 대해 별도 기호를 사용 하 여 CExampleB 내보내지고 CExampleA B.DLL을 빌드할 때 가져오게 됩니다.CExampleA입니다 A.DLL을 빌드할 때 내보내고 B.DLL (또는 일부 다른 클라이언트)를 사용 하면 가져온.

기본 제공 사용 하는 경우 이런이 종류의 계층화 할 수 AFX_EXT_CLASS_AFXEXT 전처리기 기호입니다.위에서 설명한 방법을 해당 OLE, 데이터베이스 및 네트워크 확장 Dll을 빌드할 때 MFC 자체 메커니즘을 사용 하는 방식으로 메커니즘과이 문제가 해결 되었습니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif전체 클래스를 내보내지 않는 경우

다시 전체 클래스를 내보내지 않는 경우 각별히 주의 해야 합니다.MFC 매크로에서 만드는 필수 데이터 항목을 올바르게 내보낼 수 있도록 해야 합니다.Re-defining 하 여 수행할 수 있습니다 AFX_DATA 특정 클래스의 매크로에.전체 클래스를 내보내지 않는 경우에는 이 작업을 반드시 수행해야 합니다.

예를 들면 다음과 같습니다.

// A.H
#ifdef A_IMPL
   #define CLASS_DECL_A  _declspec(dllexport)
#else
   #define CLASS_DECL_A  _declspec(dllimport)
   #endif

#undef  AFX_DATA
#define AFX_DATA CLASS_DECL_A

class CExampleA : public CObject
{
   DECLARE_DYNAMIC()
   CLASS_DECL_A int SomeFunction();
   //class definition 
   .
   .
   .
};

#undef AFX_DATA
#define AFX_DATA

hw85e4bb.collapse_all(ko-kr,VS.110).gifDllMain

다음은 확장 DLL에 대 한 주 소스 파일에 두어야 합니다. 정확한 코드입니다.표준 포함 된 후에 야 합니다.확장 DLL에 대 한 기초 파일을 만들려면 응용 프로그램 마법사를 사용 하면 제공 참고는 DllMain 를.

#include "afxdllx.h"

static AFX_EXTENSION_MODULE extensionDLL;

extern "C" int APIENTRY 
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
   if (dwReason == DLL_PROCESS_ATTACH)
   {
      // Extension DLL one-time initialization 
      if (!AfxInitExtensionModule(
             extensionDLL, hInstance))
         return 0;

      // TODO: perform other initialization tasks here
   }
   else if (dwReason == DLL_PROCESS_DETACH)
   {
      // Extension DLL per-process termination
      AfxTermExtensionModule(extensionDLL);

          // TODO: perform other cleanup tasks here
   }
   return 1;   // ok
}

호출을 AfxInitExtensionModule 캡처 모듈 런타임 클래스 (CRuntimeClass 구조) 뿐만 아니라 해당 개체 팩터리 (COleObjectFactory 개체) 사용에 대 한 나중에 때의 CDynLinkLibrary 개체가 만들어진.(선택 사항)를 호출 AfxTermExtensionModule 각 프로세스 분리 때 MFC 확장 DLL에 정리 있습니다 (프로세스가 종료 될 때 또는 결과로 DLL 언로드 됩니다 때 발생은 FreeLibrary 호출) 확장 DLL에서에서.이후 대부분의 확장 Dll가 동적으로 로드 되지 않습니다 (일반적으로 가져오기 라이브러리를 통해 연결 된), 호출을 AfxTermExtensionModule 일반적으로 필요 하지 않습니다.

응용 프로그램 로드 및 확장 Dll에 동적으로 해제 하는 경우 호출 해야 AfxTermExtensionModule 위와 같이.또한 사용 해야 AfxLoadLibraryAfxFreeLibrary (Win32 함수 대신 LoadLibraryFreeLibrary) 다중 스레드 응용 프로그램을 사용 하는 경우 또는 확장 DLL을 동적으로 로드 하는 경우.사용 하 여 AfxLoadLibraryAfxFreeLibrary 에 대 한 확장 DLL 로드 하 고 언로드할 때 실행 시작 및 종료 코드가 전역 MFC 상태 손상 되어 있지.

헤더 파일 AFXDLLX입니다.H 들어 특별 한 정의 대 한 정의와 같은 확장 Dll에서 사용 되는 구조에 대 한 AFX_EXTENSION_MODULECDynLinkLibrary.

전역 extensionDLL 와 같이 선언 해야 합니다.16 비트 버전의 MFC와 달리, 메모리 할당 및이 시간 동안 MFCxx.DLL 쯤에 완전히 초기화 되지 않으므로 MFC 함수 호출 수를 DllMain 라고 합니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif리소스 및 클래스 공유

만 간단한 MFC 확장 Dll 클라이언트 응용 프로그램과 아무에 더 많은 몇 저대역폭 함수를 내보낼 필요 합니다.자세한 사용자 인터페이스의 많은 Dll 리소스 및 C++ 클래스는 클라이언트 응용 프로그램으로 내보낼 수도 있습니다.

리소스 내보내기는 리소스 목록을 통해 수행됩니다.단일 연결된 리스트의 각 응용 프로그램에는 CDynLinkLibrary 개체입니다.리소스를 찾는, 대부분의 리소스를 로드 하는 표준 MFC 구현 시 현재 리소스 모듈 처음 찾는 (AfxGetResourceHandle) 워크 없는 경우 목록에 CDynLinkLibrary 개체는 요청 된 리소스를 로드 하는 동안.

C + + 클래스 이름을 제공 하는 C++ 개체의 동적 생성이 비슷합니다.MFC 개체의 deserialization 메커니즘 모두 해야는 CRuntimeClass 객체에 등록 된 어떤 이전에 저장 된에 따라 필요한 형식의 C++ 개체를 동적으로 작성 하 여 다시 구성할 수 있도록 합니다.

확장 DLL에에서 있는 클래스를 사용 하는 클라이언트 응용 프로그램을 사용할 경우 DECLARE_SERIAL, 내보낼 클래스는 클라이언트 응용 프로그램에 표시 되도록 해야 합니다.이 또한 살펴보는 방법으로 수행 됩니다 있는 CDynLinkLibrary 목록입니다.

고급 개념 MFC 샘플의 경우 DLLHUSK, 목록을 같습니다:

head ->   DLLHUSK.EXE   - or -   DLLHUSK.EXE
               |                      |
          TESTDLL2.DLL           TESTDLL2.DLL
               |                      |
          TESTDLL1.DLL           TESTDLL1.DLL
               |                      |
               |                      |
            MFC90D.DLL            MFC90.DLL

Mfcxx.dll은 대개 리소스 및 클래스 목록에서 마지막입니다.Mfcxx.dll에는 모든 표준 명령 Id에 대 한 프롬프트 문자열을 비롯 하 여 표준 MFC 리소스가 모두 포함 되어 있습니다.목록의 끝에 배치 있습니다 Dll 및 하 여 클라이언트 응용 프로그램이 자체는 하지만 Mfcxx.dll의 공유 리소스를 대신 사용 하는 표준 MFC 리소스의 자체 복사본.

리소스 및 모든 Dll의 클래스 이름을 클라이언트 응용 프로그램의 네임 스페이스에 병합 이름을 선택할 어떤 Id가 주의 해야 하는 단점이 있습니다.물론이 기능 하나 내보내 않는 리소스를 해제 하면 나는 CDynLinkLibrary 클라이언트 응용 프로그램 개체입니다.DLLHUSK 샘플에서는 여러 개의 헤더 파일을 사용하여 공유 리소스의 네임스페이스를 관리합니다.참조 기술 참고 35 더 많은 공유 리소스 파일 사용 팁에 대 한.

hw85e4bb.collapse_all(ko-kr,VS.110).gifDLL 초기화

위에서 설명한 것 처럼 일반적으로 만들려는 것은 CDynLinkLibrary 리소스와 클래스는 클라이언트 응용 프로그램에 내보낼 수 있는 개체입니다.DLL을 초기화 하는 내보내는 진입점을 제공 해야 합니다.적어도이 nothing을 반환 하 고 인수를 사용 하는 void 루틴 이지만 무엇이 든 될 수 있습니다.

이 방법을 사용할 경우 DLL을 사용 하려는 각 클라이언트 응용 프로그램이 초기화 루틴을 호출 해야 합니다.이것을 할당할 수 있습니다 CDynLinkLibrary 에서 개체를 DllMain 호출 바로 뒤 AfxInitExtensionModule.

초기화 루틴을 만들어야 합니다는 CDynLinkLibrary 개체에는 현재 응용 프로그램의 힙, 확장 DLL 정보까지 유선.이 다음을 수행할 수 있습니다.

extern "C" extern void WINAPI InitXxxDLL()
{
   new CDynLinkLibrary(extensionDLL);
}

루틴 이름, InitXxxDLL 이 예제에서는 원하는 수 있습니다.될 필요가 extern "C", 하지만 그렇게 하면 내보내기 목록 유지 하기 위해 쉽게 수행 합니다.

[!참고]

확장 DLL을 DLL에서 사용 하는 경우에이 초기화 함수를 내보내야 합니다.이 함수는 확장 DLL 클래스 또는 리소스를 사용 하기 전에 기본 DLL에서 호출 되어야.

hw85e4bb.collapse_all(ko-kr,VS.110).gif내보낼 항목

클래스를 내보내는 가장 간단한 방법은 사용 하는 것 __declspec (dllimport)__declspec (dllexport) 의 각 클래스 및 전역 함수를 내보낼 수 있습니다.이 훨씬 쉽게 하지만 덜 제어할 어떤 함수를 내보낼 수 있으므로 함수를 서 수로 내보낼 수 없습니다 (아래 설명 참조) 각 진입점을 명명 보다 덜 효율적입니다.TESTDLL1 및 TESTDLL2 자신의 항목을 내보내려면이 메서드를 사용 합니다.

가 더 효과적인 수단이 mfcxx. Dll에서 사용 하는 방법을 각 항목의 이름을 지정 하 여 각 항목을 직접 내보낼 수 되어 있는.DEF 파일입니다.우리 선택적 데이터 내보내기 (즉, 않는 모든) DLL에서 내보내는 때문에 우리가 내보내기 하려는 특정 인터페이스 결정 해야 합니다.항목의 형태로 맹글링된 이름을 링커에 지정 해야 하므로 어려울 것은.DEF 파일입니다.심볼 링크에 대 한 필요가 정말 필요 하지 않은 모든 C++ 클래스를 내보내지 마십시오.

려 했을 경우 내보내기 C++ 클래스에.DEF 파일을 하기 전에이 목록을 자동으로 생성할 수 있는 도구를 개발 하는 것이 좋습니다.이 수행할 수 있습니다 링크 2 단계 프로세스를 사용 합니다.DLL 내보내기가, 한 번에 연결 하 고 생성 하는 링커 허용을 합니다.맵 파일입니다..맵 파일을 사용 하 여 일부 재배열로 내보내기에 대 한 항목을 생성 하려면 사용할 수 있도록 목록을 내보낼 수 있는 함수를 생성 하면 됩니다.DEF 파일입니다.(완전 자동 되지 않고 한 동안 모든 조정 일부 손 필요 하지만) MFCxx.DLL OLE 및 수천, 수에서 데이터베이스 확장 Dll에 대 한 내보내기 목록 이러한 프로세스 생성 되었습니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gifCWinApp vs입니다.CDynLinkLibrary

MFC 확장 DLL에 없는 CWinApp-파생 개체 자체입니다. 대신 제대로 작동 해야는 CWinApp-클라이언트 응용 프로그램의 개체를 파생 합니다.따라서 클라이언트 응용 프로그램에서 기본 메시지 펌프, 유휴 루프 등 소유 합니다.

MFC 확장 DLL 각 응용 프로그램에 대 한 추가 데이터를 유지 해야 하는 경우 새 클래스에서 파생 될 수 있습니다 CDynLinkLibrary 고 루틴에 위에 설명 하는 Initxxxdll에서 만드십시오.이 경우 해당 DLL은 실행 시 현재 응용 프로그램의 CDynLinkLibrary 개체 목록을 확인하여 해당 확장 DLL에 맞는 개체를 찾습니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gifDLL 구현에서 리소스를 사용합니다.

위에서 설명한 것 처럼 기본 리소스 로드 목록 안내 CDynLinkLibrary 첫 번째 EXE 또는 DLL이 요청한 리소스를 찾는 개체입니다.모든 MFC Api와 내부 코드를 사용 하 여 모든 AfxFindResourceHandle 어디 있을 수에 관계 없이 리소스를 찾으려면 리소스 목록을 안내 합니다.

만 특정 위치에서 리소스를 로드 하 고 싶다면, Api를 사용 AfxGetResourceHandleAfxSetResourceHandle 이전 핸들을 저장 하 고 새 핸들을 설정 합니다.기존의 리소스 핸들은 클라이언트 응용 프로그램에 반환되기 전에 복원되어야 합니다.TESTDLL2 샘플 메뉴를 로드 하기 위한 명시적으로이 접근을 사용 합니다.

이 목록으로 이동하는 경우에는 리소스를 찾는 속도가 다소 느려지고 리소스 ID 범위를 관리해야 한다는 단점이 있습니다.한편, 여러 확장 DLL에 연결되는 클라이언트 응용 프로그램에서 DLL 인스턴스 핸들을 지정하지 않고도 DLL에서 제공하는 임의의 리소스를 사용할 수 있다는 장점도 있습니다.AfxFindResourceHandle은 지정된 일치 항목을 조회하기 위해 리소스 목록을 살펴보는 데 사용되는 API입니다.이 API는 리소스의 이름 및 형식을 받아서 해당 리소스가 처음 발견된 리소스 핸들 또는 NULL을 반환합니다.

DLL 버전을 사용 하 여 응용 프로그램 작성

hw85e4bb.collapse_all(ko-kr,VS.110).gif응용 프로그램 요구 사항

MFC의 공유 버전을 사용 하는 응용 프로그램 몇 가지 간단한 규칙을 따라야 합니다.

  • 이 있어야 합니다의 CWinApp 개체와 메시지 펌프에 대 한 표준 규칙을 따라야 합니다.

  • 필요한 컴파일러 플래그 (아래 참조) 집합을 컴파일해야 합니다.

  • MFCxx 가져오기 라이브러리와 링크 해야 합니다.MFC 헤더 필요한 컴파일러 플래그를 설정 하 여 응용 프로그램에 연결 해야 하는 라이브러리 링크 든 지를 결정 합니다.

  • 실행 파일을 실행 하려면 mfcxx. Dll 경로 또는 Windows 시스템 디렉터리에 있어야 합니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif개발 환경 구축

대부분의 표준 기본값 내부 메이크파일 사용 하 고 있으면 DLL 버전을 빌드하려면 프로젝트를 쉽게 변경할 수 있습니다.

다음 단계는 제대로 작동 하 고 MFC 응용 프로그램 NAFXCWD와 연결 되어 있다고 가정 합니다.(디버그)에 LIB 및 NAFXCW입니다.LIB (소매)에 대해 MFC 라이브러리의 공유 버전을 사용 하 여 변환 하려면.Visual C++ 환경에서 실행 하 고 있는 내부 프로젝트 파일.

  1. 프로젝트 메뉴를 클릭 속성이.에 일반 페이지에서 프로젝트 기본값, Mfc를 설정 공유 DLL에서 MFC 사용 (MFCxx(d).dll).

hw85e4bb.collapse_all(ko-kr,VS.110).gifNMAKE로 구축

Visual C++의 외부 메이크파일을 기능을 사용 하거나 NMAKE를 직접 사용 하는 경우, 컴파일러 및 링커 옵션을 지원 하기 위해 사용자의 메이크파일을 편집 해야 합니다.

컴파일러 플래그를입니다.

  • / /MD D_AFXDLL
    / D_AFXDLL

표준 MFC 헤더가이 기호를 정의 해야 합니다.

  • /MD
    응용 프로그램에서 C 런타임 라이브러리의 DLL 버전을 사용 해야

MFC 기본값 (예: _DEBUG 디버그에 대 한) 모든 컴파일러 플래그를 따릅니다.

링커가 라이브러리 목록을 편집 합니다.NAFXCWD 변경 합니다.라이브러리에 MFCxxD.LIB 및 NAFXCW를 변경 합니다.LIB MFCxx.LIB 합니다.LIBC를 교체 합니다.MSVCRT와 라이브러리.LIB입니다.다른 MFC 라이브러리와 MFCxxD.LIB 배치 되는 것이 중요 한 것 처럼 는 C 런타임 라이브러리.

선택적으로 추가 /D_AFXDLL 소매 및 디버그 리소스 컴파일러 옵션 (실제로 리소스를 컴파일하는 것 /R).이 최종 실행 파일을 MFC Dll에 존재 하는 리소스를 공유 하면 줄어듭니다.

이러한 변경한 후 전체 다시 빌드를 필수입니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif샘플 빌드

대부분의 MFC 샘플 프로그램은 명령줄에서 공유 호환 NMAKE 메이크파일 또는 Visual C++에서 빌드할 수 있습니다.

이러한 샘플 Mfcxx.dll을 사용 하도록 변환 하려면 로드 수는 있습니다.MAK로 Visual C++ 파일 및 위에서 설명한 프로젝트 옵션을 설정 합니다.NMAKE 빌드 사용 중인 경우, 사용자 지정할 수 있습니다 "AFXDLL = 1" NMAKE에서 명령줄을 사용 하는 공유 MFC 라이브러리를 사용 하 여 샘플을 빌드하고 있습니다.

고급 개념 MFC 샘플 DLLHUSK MFC의 DLL 버전을 함께 빌드됩니다.이 샘플에는 뿐만 아니라 mfcxx. Dll에 연결 되는 응용 프로그램을 빌드하는 방법을 보여 줍니다 있지만 또한 MFC 확장 Dll이 기술 노트에서 나중에 설명 된 것과 같은 MFC DLL 패키징 옵션의 기능도 보여 줍니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif패키징 정보

([U] MFCxx Dll의 일반 정품 버전.DLL)은 자유롭게 재배포할 수 있습니다.Dll의 디버그 버전은 자유롭게 재배포할 수 없습니다 및 응용 프로그램 개발 과정 에서만 사용 해야 합니다.

디버그 Dll 디버깅 정보와 함께 제공 됩니다.Visual C++ 디버거를 사용 하 여 DLL 뿐만 아니라 응용 프로그램의 실행을 추적할 수 있습니다.릴리스 ([U] MFCxx Dll.DLL) 디버깅 정보를 포함 하지 않습니다.

사용자 지정 또는 Dll을 다시 작성 하는 경우 다음에 뭔가 MFCDLL는 MFC SRC "MFCxx" 파일 이외의 호출 해야 합니다.MAK 빌드 옵션에 설명 하 고 DLL의 이름을 변경 하는 데 필요한 논리를 포함 합니다.이러한 Dll 잠재적으로 많은 MFC 응용 프로그램에서 공유 되므로 파일 이름 바꾸기, 필요 합니다.사용자 지정 버전의 MFC Dll 바꾸기 것 시스템에 설치 된 공유 MFC Dll을 사용 하는 다른 MFC 응용 프로그램을 중단 될 수 있습니다.

MFC Dll을 다시 작성 하는 것은 권장 되지 않습니다.

Mfcxx. Dll의 구현 방법

다음 절에서는 MFC DLL (MFCxx.DLL 및 MFCxxD.DLL) 구현 되는 방식을 설명 합니다.세부 여기도 없는 이해 모든 수행 하려는 경우에 중요 한 응용 프로그램과 함께 사용 하 여 MFC DLL입니다.세부 사항을 여기 MFC 확장 DLL을 작성 하는 방법을 이해 하는 데 필수적인 이지만이 구현을 이해 자신의 DLL을 작성 하는 데 도움이 될 수 있습니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif구현 개요

MFC DLL 실제로 위에서 설명한 대로 MFC 확장 DLL의 특수 한 경우입니다.가 매우 많은 수의 많은 클래스를 내보냅니다.확장 DLL 보다 더욱 특별 하 게 할까요 MFC DLL에는 몇 가지 추가.

hw85e4bb.collapse_all(ko-kr,VS.110).gifWin32에서 대부분의 작업 수행

16 비트 버전의 MFC 특수 기법-app 데이터 일부 80 x 86 어셈블리 코드, 프로세스별 예외 컨텍스트, 및 기타 기술에서 만든 특수 한 세그먼트의 스택 세그먼트를 비롯 하 여 많은 필요 합니다.직접입니다 원하는 대부분의 Win32 DLL에이 프로세스 당 데이터를 지원 합니다.대부분의 MFCxx.DLL 바로 NAFXCW입니다.LIB를 DLL로 패키지입니다.MFC 소스 코드를 살펴보면 이루어져야 할 특별 한 사례는 거의 이므로 거의 # ifdef _afxdll을를 찾을 수 있습니다.특히 Windows 3.1 (w i n 32로 라고도 함)에서 Win32 처리 되는 특수 한 경우.MFC DLL은 스레드 로컬 저장소 (TLS) Win32 Api 프로세스 로컬 데이터를 얻기 위해 사용 해야 합니다 직접 Win32s 프로세스별 DLL 데이터가 아닌 지원 되지 않습니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif원본 라이브러리 추가 파일에 대 한 영향

미치는 _AFXDLL 버전 표준 MFC 클래스 라이브러리 소스 및 헤더에 비교적 사소한입니다.특수 버전 파일이 (AFXV_DLL.입니다.추가 헤더 파일 (AFXDLL_ H)는 물론.H) 주 AFXWIN가 포함 됩니다.H 헤더입니다.AFXDLL_입니다.H 머리글 포함의 CDynLinkLibrary 클래스 및 기타 구현 세부 사항을 모두 _AFXDLL 응용 프로그램 및 MFC 확장 Dll.AFXDLLX입니다.MFC 확장 Dll (자세한 내용은 위의 참조) 작성을 위한 H 헤더를 제공 합니다.

일부 추가 조건부 코드에서 일반 MFC 라이브러리의 MFC SRC 소스로는 _AFXDLL # ifdef.에 추가 소스 파일 (DLLINIT.CPP) 추가 DLL 초기화 코드 및 다른 붙이기 MFC의 공유 버전을 포함합니다.

MFC의 공유 버전을 작성 하려면 추가 파일이 제공 됩니다.(아래는 DLL을 빌드하는 방법에 대 한 자세한 내용은 참조).

  • 2.DEF 파일을 디버그 (MFCxxD.DEF)에 대 한 MFC DLL 진입점을 내보내는 데 사용 되는 및 DLL 버전 (MFCxx.DEF)를 제공 합니다.

  • 가.RC 파일 (MFCDLL.RC) 표준 MFC 리소스 및 VERSIONINFO 리소스 DLL에 포함 되어 있습니다.

  • A입니다.CLW 파일이 (MFCDLL.CLW) 클래스 마법사를 사용 하 여 클래스를 MFC를 찾아볼 수 있도록 제공 됩니다.참고:이 기능은 MFC의 DLL 버전에 특정 아닙니다.

hw85e4bb.collapse_all(ko-kr,VS.110).gif메모리 관리

Mfcxx. Dll을 사용 하 여 응용 프로그램 공유 C 런타임 DLL Msvcrtxx.dll에 의해 제공 되는 일반적인 메모리 할당자를 사용 합니다.응용 프로그램, 모든 확장 Dll을 MFC Dll로 우물이 공유 메모리 할당자를 사용 합니다.메모리 할당에 대 한 공유 DLL을 사용 하 여 MFC Dll 응용 프로그램에 의해 또는 그 반대로 나중에 해제 된 메모리를 할당할 수 있습니다.응용 프로그램과 DLL 같은 할당자를 사용 해야 하기 때문에 전역 C++를 재정의 해서는 안 operator new 또는 operator delete.나머지 C 런타임 메모리 할당 루틴을 동일한 규칙을 적용 (같은 malloc, realloc, 무료, 등).

hw85e4bb.collapse_all(ko-kr,VS.110).gif서 수 및 클래스 __declspec (dllexport) DLL 명명

우리가 사용 하지 않는 있는 class**__declspec (dllexport)** C++ 컴파일러의 기능입니다.대신 목록 내보내기 (MFCxx.DEF 및 MFCxxD.DEF) 클래스 라이브러리 소스와 포함입니다.이러한 선택 집합이 진입점 (함수 및 데이터)는 내보낸.MFC private 구현 함수 또는 클래스 등의 기타 기호 내보내지지 않습니다 모든 내보내기 서 수 상주 나 비 상주 이름 테이블의 문자열 이름 없이 이루어집니다.

사용 하 여 class**__declspec (dllexport)** 작은 Dll 빌드 있지만 큰 같은 기본 메커니즘을 내보내는 MFC DLL의 경우는 실현 가능한 대안이 있는 효율성과 용량 수 제한.

이 모든 수단 이란 많은 양의 없이 손상 정도 실행 하거나 로드 하는 속도 약 800 KB 전용인 MFCxx.DLL 릴리스의 기능 패키지가 있습니다.MFCxx.DLL 않았을 100 K 큰 것이 기법은 하지 않았습니다 사용 합니다.이 또한 끝에서 추가 진입점을 추가할 수 있습니다를 합니다.DEF 파일을 사용 하 여 서 수로 내보내기의 속도 및 크기 효율성을 저해 하지 않고도 단순 버전 관리를 허용 합니다.MFC 클래스 라이브러리에서 주 버전 변경 내용을 해당 라이브러리 이름이 변경 됩니다.즉, MFC30.DLL은 MFC 클래스 라이브러리의 버전 3.0에 포함 된 재배포 가능 DLL입니다.이 DLL의 업그레이드 예는 가상의 MFC 3.1에서는 DLL mfc31으로 지정 됩니다.DLL 대신 합니다.다시 사용자 지정 버전의 MFC DLL을 만들기 위해 MFC 소스 코드를 수정 하는 경우 다른 이름 (및 가능 하나 없이 "MFC")의 이름을 사용 합니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트