Поделиться через


Изоляция библиотеки общих элементов управления MFC

Библиотека Common Controls теперь изолирована в MFC, позволяя различным модулям (например, пользовательским библиотекам DLL) использовать различные версии библиотеки Common Controls, указав версию в своих манифестах.

Приложение MFC (или пользовательский код, вызываемый MFC) вызывает API библиотеки Common Controls через функции-оболочки с именем AfxFunctionName, где FunctionName — это имя API Common Controls. Эти функции-оболочки определяются в afxcomctl32.h и afxcomctl32.inl.

Вы можете использовать макросы AFX_COMCTL32_IF_EXISTS и AFX_COMCTL32_IF_EXISTS2 (определенные в afxcomctl32.h), чтобы определить, реализует ли библиотека Common Controls определенный API вместо вызова GetProcAddress.

Технически вы вызываете API библиотеки Common Controls через класс CComCtlWrapper оболочки (определенный в afxcomctl32.h). CComCtlWrapper также отвечает за загрузку и выгрузку comctl32.dll. Состояние модуля MFC содержит указатель на экземпляр CComCtlWrapper. Доступ к классу оболочки можно получить с помощью afxComCtlWrapper макроса.

Обратите внимание, что вызов API Common Controls напрямую (не с помощью функций оболочки MFC) из приложения MFC или пользовательской библиотеки DLL будет работать в большинстве случаев, так как приложение MFC или пользовательская библиотека DLL привязана к библиотеке Common Controls, запрошенной в манифесте. Однако сам код MFC должен использовать оболочки, так как код MFC может вызываться из пользовательских библиотек DLL с различными версиями библиотеки Common Controls.