TN011: MFC를 사용 하 여 DLL의 일환으로

이 노트 Windows 동적 연결 라이브러리 (DLL)의 일부로 MFC 라이브러리를 사용할 수 있는 기본 Dll에 설명 합니다. 그것은 그들을 구축 하는 방법과 Windows Dll에 익숙한 가정 합니다. MFC 확장 Dll MFC 라이브러리에 대 한 확장을 만들 수에 대 한 자세한 MFC의 DLL 버전을 참조 하십시오.

DLL 인터페이스

기본 Dll은 응용 프로그램과 DLL 사이의 인터페이스 정상적인 C와 같은 함수를 사용 하거나 명시적으로 내보낸된 클래스에 지정 된 가정 합니다. MFC 클래스 인터페이스를 내보낼 수 없습니다.

DLL 및 응용 프로그램에서 MFC를 사용 하려는 경우 둘 다 선택할 수 MFC 라이브러리의 공유 버전을 사용 하거나 그들에 정적으로 링크 된 MFC 라이브러리의 복사본을가지고 있다. Visual c + + 4.0 이전 버전의 MFC 정적 링크 라이브러리 Dll에 대 한 응용 프로그램 달랐다. 현재 버전의 MFC, 응용 프로그램 및 DLL 둘 다 사용할 수 있습니다 MFC 라이브러리 표준 버전 중 하나. 거기에 없습니다 (MFC 런타임 시 선택 하 게)이이 버전의 Dll에 대 한 별도 라이브러리。

일반 Dll 여러 장점을:

API 제한

일부 MFC 기능이 기술적 한계 중 때문에 DLL 버전에 적용 되지 않습니다 또는 때문에 이러한 서비스는 일반적으로 응용 프로그램에서 제공 됩니다. 이러한 제한은 다음과 같습니다.:

DLL 빌드

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

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

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

C 및 c + + 파일 (c + + 프로그래머 DLL 고객을 제한 하지 않을 그런 식)에 의해 포함 될 수 있는 별도 헤더에 귀하의 Api를 놓습니다. 헤더 TRACEAPI를 참조 하십시오.MFC 고급 개념 샘플 H DLLTRACE 예. 함수를 내보내려면 모듈 정의 파일의 EXPORTS 섹션에 입력 (.DEF) 또는 함수 정의에 __declspec (dllexport)을 포함 합니다. __Declspec(dllimport) 를 사용 하 여 클라이언트 실행 파일에서 이러한 함수 가져오기。

동적으로 MFC DLL에 대 한 하나에 현재 모듈 상태를 설정 하려면 연결할 일반 Dll에서 내보낸된 함수를 모두 처음에 AFX_MANAGE_STATE 매크로 추가 해야 합니다. 이 DLL에서 내보낸 함수의 시작 부분에 다음 코드 줄을 추가 하 여 이루어집니다.:

nbsp; & nbsp;

AFX_MANAGE_STATE (AfxGetStaticModuleState ())

nbsp; & nbsp;

WinMain gt; DllMain(&G)

MFC 라이브러리는 표준 Win32 DllMain 진입점 정의 일반 MFC 응용 프로그램 에서처럼에서 CWinApp 파생된 개체를 초기화 하는. 일반 MFC 응용 프로그램 에서처럼에서 InitInstance 멤버 함수에서 모든 DLL 특정 초기화를 배치。

참고 CWinApp::Run 메커니즘 때문에 주요 메시지 펌프를 소유 하는 응용 프로그램 DLL에 적용 되지 않습니다. DLL 입 모덜리스 대화 상자 되었거나 자체의 주 프레임 창, 응용 프로그램의 기본 메시지 펌프 CWinApp::PreTranslateMessage 를 호출 하는 DLL 내보낸 루틴을 호출 해야 합니다.

이 함수는 사용 하기 위해 DLLTRACE 샘플을 참조 하십시오。

DLL 언로드되기 전에 DllMain 함수를 제공 하는 귀하의 CWinApp 파생된 클래스를 MFC에서 호출 될 ExitInstance 멤버 함수。

모두 함께 연결 하는 할 것 이다 무엇

정적으로 MFC에 링크 하는 기본 Dll과 라이브러리 (NAFXCWD이 DLL을 연결 해야 합니다.LIB 또는 NAFXCW입니다.LIB) 라고 하는 C 런타임 버전과 함께 ' LIBCMT.LIB'. 이러한 라이브러리는 이미 만들어진 및 Visual c + + 설치 프로그램을 실행 하는 경우 지정 하 여 설치할 수 있습니다.

샘플 코드

MFC 고급 개념 샘플 프로그램을 참조 하십시오 DLLTRACE 전체 샘플에 대 한. 이때 이라는 간단한 DLL ' 추적 프로그램.DLL' 그 구현 AFX 추적 플래그 대화 ( 기술 노트 7참조). 또한이 대화 상자를 사용 하 여 DLL을 호출 하는 간단한 HELLO 응용 프로그램이 있다。

참고로 몇 가지 재미 있는 것은:

TRACEAPI에서 다음 추출 합니다.H는 정적으로 MFC에 링크 하는 기본 DLL에 정의 된 하나의 API에 필요한를 보여 줍니다.:

# ifdef __cplusplus
extern "C" {
#endifnbsp; / * __cplusplus * /

TracerData 구조체
{
 ?? BOOL bEnabled;
 ?? UINT 플래그;
};

BOOL까지 파스칼 내보내기 PromptTraceFlags (Tracerdata까지 * lpData);

# ifdef __cplusplus
}
# endif(&N)

이 예제에서는 선언 c + + 사용자를 위한 'extern "C" {}' 블록에 묶여 있습니다. 이렇게 하면 다음과 같은 여러 가지 장점이 있습니다. 첫째, 그것은 DLL Api 사용할 수 비 c + + 클라이언트 응용 프로그램에서. 둘째, c + + 이름 맹글링 적용 되지 것입니다 내보낸된 이름에 있으므로 DLL 오버 헤드가 줄어듭니다. 마지막으로, 그것은 쉽게에 명시적으로 추가 하는.DEF 파일 (서 수로 내보내기) 이름 맹글링에 대해 걱정할 필요 없이。

모든 API 함수는 "파스칼 수출까지하는 것을". 비록 하지 stricly Win32 Dll에 필요한, 이러한 정의 보관 되었습니다 쉽게 다시 이식 하는 것에 대 한 16 비트 windows. Win32에서 아무것도 모두 멀리, 파스칼및 내보내기 매크로 확장。

API에서 사용 되는 구조 MFC 클래스에서 파생 되지 및 API 헤더에 완전히 정의 됩니다. 이 고, 다시 한번 하면 DLL 사용할 수 C 프로그램 뿐만 아니라 DLL과 응용 프로그램 사이의 인터페이스의 복잡성 감소。

API에서 사용 되는 모든 데이터 포인터는 명시적 멀리 포인터. 다시 말하지만, 지금까지, Win32, 정말 필요 하지 않습니다 하지만 언젠가 미래에 16 비트 Windows에 대 한 코드를 컴파일하려면 계획 하는 경우 유용。

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index