Изоляция библиотеки общих элементов управления MFCIsolation of the MFC Common Controls Library

Библиотека Common Controls теперь изолирована в MFC, что позволяет различным модулям (таким как пользовательские библиотеки DLL) использовать разные версии библиотеки общих элементов управления, указывая версию в манифестах.The Common Controls library is now isolated within MFC, allowing different modules (such as user DLLs) to use different versions of the Common Controls library by specifying the version in their manifests.

Приложение MFC (или пользовательский код, вызванный MFC) выполняет вызовы интерфейсов API библиотеки общих элементов управления через функции-оболочки с именем Afx FunctionName, где FunctionName — это имя общего API элементов управления.An MFC application (or user code called by MFC) makes calls to Common Controls library APIs through wrapper functions named AfxFunctionName, where FunctionName is the name of a Common Controls API. Эти функции-оболочки определены в afxcomctl32. h и afxcomctl32. inl.Those wrapper functions are defined in afxcomctl32.h and afxcomctl32.inl.

Можно использовать макросы AFX_COMCTL32_IF_EXISTS и AFX_COMCTL32_IF_EXISTS2 (определенные в afxcomctl32. h), чтобы определить, реализует ли библиотека Common Controls определенный API вместо вызова GetProcAddress.You can use the AFX_COMCTL32_IF_EXISTS and AFX_COMCTL32_IF_EXISTS2 macros (defined in afxcomctl32.h) to determine whether the Common Controls library implements a certain API instead of calling GetProcAddress.

Технически вызовы API библиотеки общих элементов управления осуществляется через класс-оболочку CComCtlWrapper (определяется в afxcomctl32. h).Technically, you make calls to Common Controls Library APIs through a wrapper class, CComCtlWrapper (defined in afxcomctl32.h). CComCtlWrapper также отвечает за загрузку и выгрузку comctl32.dll.CComCtlWrapper is also responsible for the loading and unloading of comctl32.dll. Состояние модуля MFC содержит указатель на экземпляр CComCtlWrapper .The MFC Module State contains a pointer to an instance of CComCtlWrapper. Доступ к классу-оболочке можно получить с помощью afxComCtlWrapper макроса.You can access the wrapper class using the afxComCtlWrapper macro.

Обратите внимание, что вызов API общих элементов управления напрямую (не используя функции-оболочки MFC) из приложения MFC или библиотеки DLL пользователя будет работать в большинстве случаев, так как приложение MFC или пользовательская библиотека DLL привязаны к библиотеке общих элементов управления, которую она запросила в своем манифесте).Note that calling Common Controls API directly (not using the MFC wrapper functions) from an MFC application or user DLL will work in most cases, because the MFC application or user DLL is bound to the Common Controls library it requested in its manifest). Однако сам код MFC должен использовать оболочки, так как код MFC может вызываться из пользовательских библиотек DLL с различными версиями библиотеки общих элементов управления.However, the MFC code itself has to use the wrappers, because MFC code might be called from user DLLs with different Common Controls library versions.