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


Точки входа экспортированных функций 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 фактически имеют специальную процедуру главного окна, которая автоматически переключает состояние модуля перед маршрутизацией любого сообщения.

См. также

Управление данными состояния модулей MFC