Compartir a través de


Aislamiento de la biblioteca de controles comunes de MFC

La biblioteca de controles comunes ahora está aislada en MFC, lo que permite que diferentes módulos (como las DLL de usuario) usen versiones diferentes de la biblioteca mediante la especificación de la versión en sus manifiestos.

Una aplicación MFC (o código de usuario llamado por MFC) realiza llamadas a las API de la biblioteca de controles comunes a través de funciones contenedoras denominadas AfxFunctionName, donde FunctionName es el nombre de una API de controles comunes. Esas funciones contenedoras están definidas en afxcomctl32.h y afxcomctl32.inl.

Puede usar las macros AFX_COMCTL32_IF_EXISTS y AFX_COMCTL32_IF_EXISTS2 (definidas en afxcomctl32.h) para determinar si la biblioteca de controles comunes implementa una determinada API en lugar de llamar a GetProcAddress.

Técnicamente, se realizan llamadas a las API de la biblioteca de controles comunes mediante una clase contenedora, CComCtlWrapper (definida en afxcomctl32.h). CComCtlWrapper también es responsable de la carga y descarga de comctl32.dll. El estado del módulo MFC contiene un puntero a una instancia de CComCtlWrapper. Puede acceder a la clase contenedora mediante la macro afxComCtlWrapper.

Tenga en cuenta que llamar directamente a la API de controles comunes (no usar las funciones contenedoras de MFC) desde una aplicación de MFC o DLL de usuario funcionará en la mayoría de los casos, ya que la aplicación de MFC o la DLL de usuario estarán enlazadas a la biblioteca de controles comunes que solicitó en su manifiesto). Sin embargo, el propio código de MFC tiene que usar los contenedores, ya que es posible que se llame al código MFC desde DLL de usuario con diferentes versiones de la biblioteca de controles comunes.