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


Состояние модулей регулярной динамической библиотеки DLL, связанной с MFC

Возможность динамически связывать обычную библиотеку DLL с библиотекой DLL MFC позволяет реализовать некоторые очень сложные конфигурации. Например, обычная библиотека DLL и исполняемый файл, использующий ее, могут динамически связаться с DLL-библиотекой MFC и любыми DLL-библиотеками расширения.

Подобная конфигурация создает проблему по отношению к глобальным данным MFC, таким как указатель на текущий объект CWinApp и сопоставления дескрипторов.

До версии 4.0 библиотеки MFC глобальные данные хранились в самой библиотеке DLL MFC и были общими для всех модулей процесса. Так как любой процесс, использующий библиотеку DLL Win32, получает собственную копию данных DLL, подобная схема предоставляет простой способ отслеживания данных каждого процесса. Кроме того, так как модель AFXDLL предполагает, что в процессе существует только один объект CWinApp и только один набор сопоставлений дескрипторов, эти элементы можно отследить в самой библиотеке DLL MFC.

Но с появлением возможности динамического связывания обычной DLL с библиотекой DLL MFC стало возможным существование нескольких объектов CWinApp в процессе, а также нескольких наборов сопоставлений дескрипторов. Как MFC отслеживает, какие объекты ей использовать?

Решение заключается в предоставлении каждому модулю (приложению или обычной DLL) своей копии сведений о глобальном состоянии. Следовательно, после вызова AfxGetApp в обычной библиотеке DLL возвращается указатель на объект CWinApp в библиотеке DLL, а не в исполняемом файле. Эта помодульная копия глобальных данных MFC называется состоянием модуля, она описывается в разделе Техническая заметка MFC 58.

Общая процедура окна MFC автоматически переключается на верное состояние модуля, поэтому не следует волноваться об этом для любых обработчиков сообщений, реализованных в обычной DLL. Но если исполняемый файл вызывает обычную библиотеку DLL, необходимо явно задать текущее состояние модуля для одной из DLL. Для этого следует использовать макрос AFX_MANAGE_STATE в каждой функции, экспортируемой из DLL. Для этого следует добавить следующий код в начало функций, экспортируемых из библиотеки DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Дополнительные сведения

См. также

Основные понятия

DLL в Visual C++