Точки входа экспортированных функций DLL
Для экспортированных функций библиотеки DLL используйте макрос AFX_MANAGE_STATE для поддержания правильного глобального состояния при переключении с модуля DLL на библиотеку DLL вызывающего приложения.
При вызове этот макрос задает pModuleState
указатель на AFX_MODULE_STATE
структуру, содержащую глобальные данные для модуля, в качестве эффективного состояния модуля для остальной части содержащего область функции. После выхода из область, содержащего макрос, предыдущее эффективное состояние модуля автоматически восстанавливается.
Это переключение достигается путем создания экземпляра AFX_MODULE_STATE
класса в стеке. В конструкторе этот класс получает указатель на текущее состояние модуля и сохраняет его в переменной члена, а затем задает pModuleState
в качестве нового действующего состояния модуля. В деструкторе этот класс восстанавливает указатель, хранящийся в его переменной-члене в качестве эффективного состояния модуля.
Если у вас есть экспортируемая функция, например функция, которая запускает диалоговое окно в библиотеке DLL, необходимо добавить следующий код в начало функции:
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Это переключает текущее состояние модуля на состояние, возвращаемое из AfxGetStaticModuleState до конца текущего область.
Проблемы с ресурсами в библиотеках DLL возникают, если AFX_MANAGE_STATE
макрос не используется. По умолчанию MFC использует дескриптор ресурсов основного приложения для загрузки шаблона ресурса. Этот шаблон фактически хранится в библиотеке DLL. Основная причина заключается в том, что сведения о состоянии модуля MFC не были переключены макросом AFX_MANAGE_STATE
. Дескриптор ресурса восстанавливается из состояния модуля MFC. Не переключение состояния модуля приводит к неправильному использованию дескриптора ресурсов.
AFX_MANAGE_STATE
не требуется помещать в каждую функцию в библиотеке DLL. Например, код MFC в приложении может вызываться без того, InitInstance
что MFC автоматически сдвигает состояние модуля доInitInstance
, а затем переключает его обратно после InitInstance
AFX_MANAGE_STATE
возврата. То же самое верно для всех обработчиков карты сообщений. Обычные библиотеки DLL MFC фактически имеют специальную процедуру главного окна, которая автоматически переключает состояние модуля перед маршрутизацией любого сообщения.