MFC 공용 컨트롤 라이브러리 격리

이제 공용 컨트롤 라이브러리가 MFC 내에서 격리되어 다양한 모듈(예: 사용자 DLL)이 매니페스트에 버전을 지정하여 다른 버전의 Common Controls 라이브러리를 사용할 수 있습니다.

MFC 애플리케이션(또는 MFC에서 호출하는 사용자 코드)은 FunctionName이라는 Afx래퍼 함수를 통해 Common Controls 라이브러리 API를 호출합니다. 여기서 FunctionName은 Common Controls API의 이름입니다. 이러한 래퍼 함수는 afxcomctl32.h 및 afxcomctl32.inl에 정의됩니다.

AFX_COMCTL32_IF_EXISTS 및 AFX_COMCTL32_IF_EXISTS2 매크로(afxcomctl32.h에 정의됨)를 사용하여 Common Controls 라이브러리가 GetProcAddress를 호출하는 대신 특정 API를 구현하는지 여부를 확인할 수 있습니다.

기술적으로는 래퍼 클래스 CComCtlWrapper (afxcomctl32.h에 정의됨)를 통해 Common Controls 라이브러리 API를 호출합니다. CComCtlWrapper 는 comctl32.dll의 로드 및 언로드도 담당합니다. MFC 모듈 상태에는 인스턴스에 대한 포인터가 포함되어 있습니다 CComCtlWrapper. 매크로를 사용하여 래퍼 클래스에 afxComCtlWrapper 액세스할 수 있습니다.

MFC 애플리케이션 또는 사용자 DLL이 매니페스트에서 요청한 Common Controls 라이브러리에 바인딩되어 있으므로 MFC 애플리케이션 또는 사용자 DLL에서 직접(MFC 래퍼 함수를 사용하지 않음) Common Controls API를 직접 호출하는 것은 대부분의 경우에 작동합니다. 그러나 MFC 코드는 서로 다른 Common Controls 라이브러리 버전이 있는 사용자 DLL에서 호출될 수 있으므로 MFC 코드 자체는 래퍼를 사용해야 합니다.