Инициализация динамических расширений
Чтобы "вписаться" в структуру 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!