다음을 통해 공유


TN011: MFC DLL의 일부로 사용 하 여

이 참고가 Windows 동적 연결 라이브러리 (DLL)의 일부로 MFC 라이브러리를 사용할 수 있게 하는 기본 Dll에 설명 합니다.이 경우 사용자 Windows Dll을 사용 하 고 작성 하는 방법을 잘 알고 있다고 가정 합니다.MFC 확장 Dll에 대 한 정보를 만들 수 있는 확장에 MFC 라이브러리를 참조 하십시오 MFC DLL 버전.

DLL 인터페이스

응용 프로그램과 DLL 간에 인터페이스 C와 비슷한 함수 또는 명시적으로 내보낸된 클래스에 지정 된 기본 Dll을 가정 합니다.MFC 클래스 인터페이스는 내보낼 수 없습니다.

DLL과 응용 프로그램을 MFC를 사용 하려는 경우 두 복사본의 라이브러리에 정적으로 링크 또는 MFC 라이브러리의 공유 버전을 사용할 수 있습니다.응용 프로그램 및 DLL 모두 MFC 라이브러리 표준 버전 중 하나를 사용할 수 있습니다.

기본 Dll에는 몇 가지 이점이 있습니다.

  • DLL을 사용 하는 응용 프로그램 MFC를 사용 하지 않아도 및 Visual C++ 응용 프로그램을 사용할 필요가 없습니다.

  • 정적으로 MFC에 링크 하는 기본 Dll에는 DLL의 크기 사용 및 연결 된만 MFC 및 C 런타임 루틴에 따라 달라 집니다.

  • 동적으로 MFC에 링크 하는 기본 Dll에는 MFC의 공유 버전을 사용 하 여 메모리에서 절약 중요할 수 있습니다.하지만 공유 Mfc Dll을 배포 해야<version>.dll 및 Msvvcrt<version>와 DLL.dll입니다.

  • DLL 디자인 클래스 구현 방법의 독립적입니다.DLL 디자인 원하는 Api로만 내보냅니다.따라서 구현을 변경 하는 경우 기본 Dll 여전히 유효 합니다.

  • 정적으로 MFC에 링크 하는 기본 Dll을 MFC DLL 및 응용 프로그램 모두를 사용 하는 경우는 문제 없이 응용 프로그램은 다른 버전의 MFC DLL 또는 그 반대의 경우도 마찬가지입니다.각 DLL 또는 EXE에 MFC 라이브러리에 정적으로 링크 되므로 버전 할 여지가 있습니다.

API 제한

일부 MFC 기능 하나 기술적인 제한 때문에 DLL 버전에 적용 되지 않습니다 또는 이러한 서비스는 응용 프로그램에서 일반적으로 제공 되므로.MFC의 현재 버전에 적용 되지 않는 유일한 함수입니다 CWinApp::SetDialogBkColor.

DLL을 빌드

기호를 MFC에 정적으로 링크 하는 기본 Dll을 컴파일할 때 _USRDLL 및 _WINDLL 를 정의 해야 합니다.DLL 코드는 다음 컴파일러 스위치를 컴파일해야 합니다.

  • /D_WINDLLDLL을 컴파일하는 것을 나타냅니다.

  • /D_USRDLL지정 된 기본 DLL을 빌드하는

또한 이러한 기호를 정의 하 고 동적으로 MFC에 링크 하는 기본 Dll을 컴파일할 때 다음 컴파일러 스위치를 사용 해야 합니다.또한 기호 _AFXDLL 정의 해야 합니다 및 DLL 코드를 컴파일해야 합니다.

  • /D_AFXDLL동적으로 MFC에 링크 한 기본 DLL을 빌드하는 것을 지정 합니다.

응용 프로그램과 DLL 간에 인터페이스 (Api)를 명시적으로 내보내야 합니다.낮은 대역폭으로 사용자 인터페이스를 정의 하 고 가능한 경우에 C 인터페이스를 사용 하는 것이 좋습니다.직접 C 인터페이스 보다 더 복잡 한 C++ 클래스를 유지 하기 쉽습니다.

Api를 C와 C++ 파일에 포함 될 수 있는 별도 머리글에 둡니다.ScreenCap.h 헤더에서 고급 개념 MFC 샘플을 참조 하십시오. DLLScreenCap 예.내보내기 함수에 입력은 EXPORTS 모듈 정의 파일의 구역 (.DEF) 또는 포함 __declspec(dllexport) 에서 함수 정의 합니다.사용 __declspec(dllimport) 클라이언트 실행 파일에 이러한 함수를 가져올 수 있습니다.

추가 해야 해당 AFX_MANAGE_STATE 매크로 동적으로 MFC에 링크 하는 기본 Dll에서 내보낸 모든 함수의 시작 부분에.이 매크로 현재 모듈 상태를 해당 DLL 위한 설정합니다.이 매크로 사용 하려면 DLL에서 내보낸 함수의 시작 부분에 다음 코드 줄을 추가 합니다.

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

WinMain-&gt; DllMain

MFC 라이브러리 표준 Win32 정의 DllMain 초기화 진입점을 CWinApp 개체는 일반 MFC 응용 프로그램 에서처럼에서 파생 합니다.모든 특정 DLL 초기화에서 배치의 InitInstance 메서드는 일반 MFC 응용 프로그램 에서처럼에서.

이때의 CWinApp::Run 응용 프로그램에서 기본 메시지 펌프를 소유 하 고 있으므로 DLL에는 메커니즘이 적용 되지 않습니다.DLL에서 모덜리스 대화 상자를 표시 하거나 자체의 기본 프레임 창을 갖는 경우, 응용 프로그램의 기본 메시지 펌프를 호출 하는 DLL 내보낸 루틴을 호출 해야 CWinApp::PreTranslateMessage.

이 함수의 사용에 대 한 DLLScreenCap 샘플을 참조 하십시오.

DllMain 를 호출 합니다. MFC에서 제공 하는 함수는 CWinApp::ExitInstance 에서 파생 된 클래스의 메서드 CWinApp DLL이 언로드되기 전에.

DLL 링크

정적으로 MFC에 링크 하는 기본 Dll을 라는 libcmt.lib를 C 런타임 버전 Nafxcwd.lib 또는 nafxcw.lib와 DLL을 링크 해야 합니다.이러한 라이브러리 사전 빌드한 및 Visual C++ 설치 프로그램을 실행할 때이 지정 하 여 설치할 수 있습니다.

샘플 코드

DLLScreenCap 샘플 프로그램 고급 개념 MFC 샘플을 참조 하십시오.참고이 샘플에서는 몇 가지 흥미로운 다음과 같습니다.

  • 컴파일러 플래그 dll 및 응용 프로그램은 서로 다릅니다.

  • 연결선 및.응용 프로그램 dll DEF 파일 형식과 다릅니다.

  • DLL을 사용 하는 응용 프로그램에서 C++ 없습니다.

  • 응용 프로그램과 DLL 간에 인터페이스 C 또는 C++에서 사용할 수 있는 고 내보낸 API와 DLLScreenCap.def입니다.

다음 예제에서는 정적으로 MFC에 링크 한 기본 DLL에서 정의 하는 API를 보여 줍니다.이 예제에서는 선언에 포함 된 extern "C" { } 블록 C++ 사용자에 대 한.이렇게 하면 몇 가지 장점이 있습니다.먼저 DLL Api를 비 C++ 클라이언트 응용 프로그램에 적합 합니다.둘째, C++ 이름 관리 내보내지는 이름에 적용 되지 않으므로 DLL 오버 헤드가 줄어듭니다.마지막으로,이를 명시적으로 추가 하기가 쉬워집니다는.DEF 파일 (서 수로 내보내기 위해) 이름 관리에 대 한 걱정 없이.

#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */

struct TracerData
{
    BOOL    bEnabled;
    UINT    flags;
};

BOOL PromptTraceFlags(TracerData FAR* lpData);

#ifdef __cplusplus
}
#endif

API에 사용 되는 구조체 MFC 클래스에서 파생 되지 않은 및 API 헤더에서 정의 됩니다.DLL과 응용 프로그램 사이의 인터페이스의 복잡성을 감소 하 고 C 프로그램에서 DLL 사용할 수 있습니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트