MFC 通用控件库的隔离

Common Controls 库现在在 MFC 中隔离,允许不同的模块(如用户 DLL)通过在其清单中指定版本来使用不同版本的 Common Controls 库。

MFC 应用程序(或 MFC 调用的用户代码)通过名为 AfxFunctionName 的包装函数(其中 FunctionName 是 Common Controls API 的名称)调用 Common Controls 库 API。 这些包装函数在 afxcomctl32.h 和 afxcomctl32.inl 中定义。

可以使用 AFX_COMCTL32_IF_EXISTSAFX_COMCTL32_IF_EXISTS2 宏(在 afxcomctl32.h 中定义)来确定 Common Controls 库是否实现特定的 API,而不是调用 GetProcAddress

从技术上讲,可以通过包装类 CComCtlWrapper (在 afxcomctl32.h 中定义)调用 Common Controls 库 API。 CComCtlWrapper 还负责 comctl32.dll的加载和卸载。 MFC 模块状态包含一个指向 CComCtlWrapper 实例的指针。 您可以使用 afxComCtlWrapper 宏来访问包装器类。

请注意,从 MFC 应用程序或用户 DLL 直接调用 Common Controls API(不使用 MFC 包装函数)在大多数情况下将正常工作,因为 MFC 应用程序或用户 DLL 绑定到它在清单中请求的 Common Controls 库。 但是,MFC 代码本身必须使用包装器,因为 MFC 代码可能从具有不同 Common Controls 库版本的用户 DLL 调用。