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


Макросы и функции для управления библиотеками 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 объект в контексте каждого модуля, который будет использовать его. AfxOleInitModuleCDynLinkLibrary создает объект в контексте обычной библиотеки 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 объект в контексте каждого модуля, который будет использовать его. AfxNetInitModuleCDynLinkLibrary создает объект в контексте обычной библиотеки 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