Инициализация динамических расширений



Чтобы "вписаться" в структуру MFC, динамические расширения MFC требуют дополнительной начальной настройки. Соответствующие операции выполняются функцией DllMain. Рассмотрим пример этой функции, созданный мастером AppWizard.

 static AFX_EXTENSION_MODULE MyExtDLL = { NULL, NULL } ;

 extern "C" int APIENTRY

 DllMain(HINSTANCE hinstance, DWORD dwReason, LPVOID IpReserved)

 {

if (dwReason == DLL_PROCESS_ATTACH)

{

    TRACED("MYEXT.DLL Initializing!n") ;

    // Extension DLL one-time initialization

    AfxInitExtensionModule(MyExtDLL, hinstance) ;

    // Insert this DLL into the resource chain

    new CDynLinkLibrary(MyExtDLL);

}

else if (dwReason == DLL_PROCESS_DETACH)

{

    TRACED("MYEXT.DLL Terminating!n") ;

}

return 1; // ok

 }

Самой важной частью этой функции является вызов AfxInitExtensionModule. Это инициализация динамической библиотеки, позволяющая ей корректно работать в составе структуры MFC. Аргументами данной функции являются передаваемый в DllMain дескриптор библиотеки DLL и структура AFX_EXTENSION_MODULE, содержащая информацию о подключаемой к MFC динамической библиотеке.

Нет необходимости инициализировать структуру AFX_EXTENSION_MODULE явно. Однако объявить ее нужно обязательно. Инициализацией же займется конструктор CDynLinkLibrary. В DLL необходимо создать класс CDynLinkLibrary. Его конструктор не только будет инициализировать структуру AFX_EXTENSION_MODULE, но и добавит новую библиотеку в список DLL, с которыми может работать MFC.

Загрузка динамических расширений MFC

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

 if(dwReason == DLL_PROCESS_DETACH)

 {

AfxTermExtensionModule(MyExtDLL);

 }

Кроме того, следует помнить, что новая библиотека DLL является динамическим расширением и должна загружаться и выгружаться динамически, с помощью функций AfxLoadLibrary и AfxFreeLibrary,а не LoadLibrary и FreeLibrary.

Экспортирование функций из динамических расширений

Рассмотрим теперь, как осуществляется экспортирование в приложение функций и классов из динамического расширения. Хотя добавить в DEF-файл все расширенные имена можно и вручную, лучше использовать модификаторы для объявлений экспортируемых классов и функций, такие как AFX_EXT_CLASS и AFX_EXT_API,например:

 class AFX_EXT_CLASS CMyClass : public CObject

 (

// Your class declaration

 }

 void AFX_EXT_API MyFunc() ;

 


Дата добавления: 2019-07-15; просмотров: 152; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!