Макросы и функции для управления библиотеками DLL
Имя | Описание |
---|---|
AFX_EXT_CLASS ] |
Экспортирует классы. |
AFX_MANAGE_STATE |
Защита экспортируемой функции в библиотеке DLL. |
AfxOleInitModule |
Предоставляет поддержку OLE из обычной библиотеки DLL MFC, которая динамически связана с MFC. |
AfxNetInitModule |
Предоставляет поддержку сокетов MFC из обычной библиотеки DLL MFC, которая динамически связана с MFC. |
AfxGetAmbientActCtx |
Возвращает текущее состояние флага состояния для каждого модуля. |
AfxGetStaticModuleState |
Задает состояние модуля перед инициализацией и восстанавливает предыдущее состояние модуля после очистки. |
AfxInitExtensionModule |
Инициализирует библиотеку DLL. |
AfxSetAmbientActCtx |
задайте флаг состояния для каждого модуля, который влияет на поведение WinSxS MFC. |
AfxTermExtensionModule |
Позволяет MFC очистить библиотеку DLL расширения MFC, когда каждый процесс отсоединяется от библиотеки DLL. |
AFX_EXT_CLASS
Библиотеки DLL расширения MFC используют макрос AFX_EXT_CLASS
для экспорта классов; исполняемые файлы, которые связываются с библиотекой DLL расширения MFC, используют макрос для импорта классов.
Замечания
AFX_EXT_CLASS
С помощью макроса те же файлы заголовков, которые используются для создания библиотеки DLL расширения MFC, можно использовать с исполняемыми файлами, которые связываются с библиотекой DLL.
В файле заголовка библиотеки DLL добавьте AFX_EXT_CLASS
ключевое слово в объявление класса следующим образом:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Дополнительные сведения см. в разделе "Экспорт и импорт с помощью AFX_EXT_CLASS
".
Требования
Заголовок:<afxv_dll.h>
AFX_MANAGE_STATE
Вызовите этот макрос для защиты экспортируемой функции в библиотеке DLL.
Синтаксис
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )
Параметры
pModuleState
Указатель на структуру AFX_MODULE_STATE
.
Замечания
При вызове pModuleState
этого макроса является эффективным состоянием модуля для остальной части немедленной содержащей области. После выхода из области предыдущее действующее состояние модуля будет автоматически восстановлено.
Структура AFX_MODULE_STATE
содержит глобальные данные для модуля, то есть часть состояния модуля, которое отправляется или подается.
По умолчанию MFC использует дескриптор ресурсов основного приложения для загрузки шаблона ресурса. Если у вас есть экспортируемая функция в библиотеке DLL, например функция, которая запускает диалоговое окно в библиотеке DLL, шаблон ресурса хранится в модуле DLL. Обязательно переключите состояние модуля, чтобы использовать правильный дескриптор. Вы можете переключить состояние, добавив следующий код в начало функции:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Этот макрос переключает текущее состояние модуля с состоянием, возвращаемым до AfxGetStaticModuleState
конца текущей области.
Дополнительные сведения о состояниях модуля и MFC см. в разделе "Управление данными о состоянии модулей MFC" и техническим примечанием 58.
Примечание.
При создании контекста активации для сборки MFC используется AfxWinInit
для создания контекста и активации и AFX_MANAGE_STATE
деактивации. Обратите внимание также, что AFX_MANAGE_STATE
включена для статических библиотек MFC, а также библиотек DLL MFC, чтобы разрешить код MFC выполняться в соответствующем контексте активации, выбранном библиотекой DLL пользователя. Дополнительные сведения см. в разделе "Поддержка контекстов активации" в состоянии модуля MFC.
Требования
Заголовок:<afxstat_.h>
AfxOleInitModule
Для поддержки OLE из обычной библиотеки DLL MFC, которая динамически связана с MFC, вызовите эту функцию в обычной функции библиотеки DLL CWinApp::InitInstance
MFC для инициализации БИБЛИОТЕКИ OLE MFC.
Синтаксис
void AFXAPI AfxOleInitModule( );
Замечания
Библиотека DLL OLE MFC — это библиотека DLL расширения MFC; Чтобы библиотека DLL расширения MFC была подключена к CDynLinkLibrary
цепочке, она должна создать CDynLinkLibrary
объект в контексте каждого модуля, который будет использовать его. AfxOleInitModule
CDynLinkLibrary
создает объект в контексте обычной библиотеки DLL MFC, чтобы он был подключен к цепочке CDynLinkLibrary
объектов обычной библиотеки DLL MFC.
Если вы создаете элемент управления OLE и используете COleControlModule
его, не следует вызывать AfxOleInitModule
, так как InitInstance
функция-член для COleControlModule
вызовов AfxOleInitModule
.
Требования
Заголовок: <afxdll_.h>
AfxNetInitModule
Для поддержки сокетов MFC из обычной библиотеки DLL MFC, которая динамически связана с MFC, добавьте вызов этой функции в функцию обычной библиотеки DLL CWinApp::InitInstance
MFC, чтобы инициализировать библиотеку DLL сокетов MFC.
Синтаксис
void AFXAPI AfxNetInitModule( );
Замечания
Библиотека DLL сокетов MFC — это библиотека DLL расширения MFC; Чтобы библиотека DLL расширения MFC была подключена к CDynLinkLibrary
цепочке, она должна создать CDynLinkLibrary
объект в контексте каждого модуля, который будет использовать его. AfxNetInitModule
CDynLinkLibrary
создает объект в контексте обычной библиотеки DLL MFC, чтобы он был подключен к цепочке CDynLinkLibrary
объектов обычной библиотеки DLL MFC.
Требования
Заголовок:<afxdll_.h>
AfxGetAmbientActCtx
Эта функция используется для получения текущего состояния флага состояния для каждого модуля, который влияет на поведение WinSxS MFC.
Синтаксис
BOOL AFXAPI AfxGetAmbientActCtx();
Возвращаемое значение
Текущее значение флага состояния модуля.
Замечания
Если установлен флаг (по умолчанию) и поток входит в модуль MFC (см. см AFX_MANAGE_STATE
.), контекст модуля активируется.
Если флаг не задан, контекст модуля не активируется при входе.
Контекст модуля определяется из манифеста, часто внедренного в ресурсы модуля.
Требования
Заголовок:<afxcomctl32.h>
AfxGetStaticModuleState
Вызовите эту функцию, чтобы задать состояние модуля перед инициализацией и восстановить предыдущее состояние модуля после очистки.
Синтаксис
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
Возвращаемое значение
Указатель на структуру AFX_MODULE_STATE
.
Замечания
Структура AFX_MODULE_STATE
содержит глобальные данные для модуля, то есть часть состояния модуля, которое отправляется или подается.
По умолчанию MFC использует дескриптор ресурсов основного приложения для загрузки шаблона ресурса. Если у вас есть экспортируемая функция в библиотеке DLL, например функция, которая запускает диалоговое окно в библиотеке DLL, шаблон ресурса хранится в модуле DLL. Обязательно переключите состояние модуля, чтобы использовать правильный дескриптор. Вы можете переключить состояние, добавив следующий код в начало функции:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Этот макрос переключает текущее состояние модуля с состоянием, возвращаемым до AfxGetStaticModuleState
конца текущей области.
Дополнительные сведения о состояниях модуля и MFC см. в разделе "Управление данными о состоянии модулей MFC" и техническим примечанием 58.
Требования
Заголовок:<afxstat_.h>
AfxInitExtensionModule
Вызовите эту функцию в библиотеке DLL расширения MFC, чтобы инициализировать библиотеку DllMain
DLL.
Синтаксис
BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );
Параметры
state
Ссылка на AFX_EXTENSION_MODULE
структуру структуры , которая будет содержать состояние модуля DLL расширения MFC после инициализации. Состояние включает копию объектов класса среды выполнения, которые были инициализированы библиотекой DLL расширения MFC как часть обычной статической конструкции объектов, выполняемой до DllMain
ввода.
hModule
Дескриптор модуля DLL расширения MFC.
Возвращаемое значение
TRUE
Значение , если библиотека DLL расширения MFC успешно инициализирована; FALSE
в противном случае .
Замечания
Например:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
...
AfxInitExtensionModule
создает копию HMODULE библиотеки DLL и записывает классы среды выполнения (CRuntimeClass
структуры) библиотеки DLL, а также его фабрики объектов (COleObjectFactory
объекты) для последующего CDynLinkLibrary
использования при создании объекта.
Библиотеки DLL расширения MFC должны выполнять две задачи в их DllMain
функции:
Вызов
AfxInitExtensionModule
и проверка возвращаемого значения.CDynLinkLibrary
Создайте объект, если библиотека DLL будет экспортироватьCRuntimeClass
объекты Structure или имеет собственные пользовательские ресурсы.
Вы можете вызвать AfxTermExtensionModule
библиотеку DLL расширения MFC, если каждый процесс отсоединяется от библиотеки DLL расширения MFC (что происходит при завершении процесса или при выгрузке библиотеки DLL вызовом AfxFreeLibrary
).
Требования
Заголовок:<afxdll_.h>
AfxSetAmbientActCtx
Используйте эту функцию для задания флага состояния модуля, который влияет на поведение WinSxS MFC.
Синтаксис
void AFXAPI AfxSetAmbientActCtx(BOOL bSet);
Параметры
bSet
Новое значение флага состояния модуля.
Замечания
Если установлен флаг (по умолчанию) и поток входит в модуль MFC (см. см AFX_MANAGE_STATE
.), контекст модуля активируется.
Если флаг не задан, контекст модуля не активируется при входе.
Контекст модуля определяется из манифеста, часто внедренного в ресурсы модуля.
Пример
BOOL CMFCListViewApp::InitInstance()
{
AfxSetAmbientActCtx(FALSE);
// Remainder of function definition omitted.
}
Требования
Заголовок:<afxcomctl32.h>
AfxTermExtensionModule
Вызовите эту функцию, чтобы разрешить MFC очистить библиотеку DLL расширения MFC, когда каждый процесс отсоединяется от библиотеки DLL (что происходит при завершении процесса или при выгрузке библиотеки DLL вызовом AfxFreeLibrary
).
Синтаксис
void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );
Параметры
state
Ссылка на AFX_EXTENSION_MODULE
структуру, содержащую состояние модуля DLL расширения MFC.
bAll
Если значение TRUE, удалите все модули DLL расширения MFC. В противном случае очистите только текущий модуль DLL.
Замечания
AfxTermExtensionModule
удаляет любое локальное хранилище, подключенное к модулю, и удаляет все записи из кэша карты сообщений. Например:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
new CMyDynLinkLibrary(NVC_MFC_DLLDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NVC_MFC_DLL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(NVC_MFC_DLLDLL);
}
return 1; // ok
}
Если приложение загружает и освобождает библиотеки DLL расширений MFC динамически, обязательно вызовите AfxTermExtensionModule
. Так как большинство библиотек DLL расширения MFC не загружаются динамически (обычно они связаны с помощью библиотек импорта), вызов AfxTermExtensionModule
обычно не требуется.
Библиотеки DLL расширения MFC должны вызыватьсяAfxInitExtensionModule
.DllMain
Если библиотека DLL экспортирует CRuntimeClass
объекты или имеет собственные пользовательские ресурсы, необходимо также создать CDynLinkLibrary
объект в DllMain
.
Требования
Заголовок:<afxdll_.h>
См. также
Макросы и глобальные
AfxMessageBox
Управление данными состояния модулей MFC