Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
DLL-расширения и обычные DLL
До сих пор мы рассматривали DLL-модули Win32, в которых есть функция DllMain() и какие-то экспортируемые функции. Теперь двинемся в мир, построенный на каркасе MFC-приложений, расширяющем базовую поддержку DLL. AppWizard позволяет создавать два вида DLL с поддержкой MFC-библиотеки: DLL-расширения (extension DLL) и обычные DLL (regular DLL). Но прежде чем выбирать, надо разобраться в сути предмета.
DLL-расширение поддерживает интерфейс C++. Другими словами, такая DLL может экспортировать целые классы, а клиент может создавать объекты этих классов или разрабатывать производные классы. DLL-расширение динамически связывается с кодом DLL-версии библиотеки MFC, поэтому необходимо, чтобы клиентская программа компоновалась с MFC тоже динамически (AppWizard предлагает это по умолчанию) и чтобы версии динамических библиотек MFC (mfc42.dll, mfcd42.dll и т. д.) у клиентской программы и DLL-расширения были одинаковы. DLL-расширения весьма компактны: можно создать простое DLL-расширение размером всего 12Кб, которое загружается очень быстро. Если же Вам нужна DLL, которую можно загружать в любую Win32-среду программирования, включая Visual Basic б.0, значит, Вам нужна обычная DLL. Однако здесь есть одно большое «но»: обычная DLL может экспортировать только С-функции и не способна экспортировать классы С++, функции-члены или переопределенные функции, поскольку в каждом компиляторе С++ используется свой метод расширения имен функций. Правда, внутри самой DLL этого типа можно использовать классы С++ (и классы MFC в том числе). Создавая обычную DLL, Вы можете выбирать, каким образом связывать ее с MFC-библиотекой – статически или динамически. Если Вы остановитесь на статическом связывании, в DLL будет включена копия нужного кода MFC-библиотеки, и таким образом Вы получите самодостаточный DLL-модуль. Средний размер статически связанной DLL без отладочной информации около 144 Кб. Если же Вы предпочтете динамическое связывание, размер уменьшится приблизительно до 17Кб, но при этом надо будет позаботиться о том, чтобы на компьютере пользователя присутствовали необходимые динамические модули MFC. Это не проблема, если клиентская программа уже динамически связана с той же версией MFC. Когда Вы сообщаете какой тип DLL или ЕХЕ Вам нужен, для константы #define для компилятора устанавливаются так, как показано в следующей таблице.
В MVS-2005 Вы их найдете в свойствах проекта по пути Configuration PropertiesèC/C++èCommand Line (рис. 1). Рис. 1. Ключи компилятора для сборки регулярной DLL
Общие DLL MFC-библиотеки
Если Вы собираете проект для конфигурации Windows Debug, выбрав вариант с общими DLL-модулями MFC-библиотеки, то Ваша программа динамически связывается с одной или несколькими библиотеками MFC (ИС MVS 6.0 с кодировкой ANSI): · mfc42d.dll важнейшие MFC-классы (ядро); · mfco42d.dll ActiveX- (OLE-) классы; · mfcd42d.dll классы для работы с базами данных (ODBC и DAO); · mfcn42d.dll классы WinSock, WinInet.
Если проект компилируется и собирается в среде MVS-2005, то в приведенных именах библиотек надо заменить 42 на 80 (это номера версий MFC 4.2 и 8.0) и, для версии Unicode, вставить символ 'u' перед символом ‘d’. При создании окончательной версии (конфигурация Release) программа динамически связывается только с mfc42.dll (mfc80u.dll для Unicode-версии, собираемой в MVS-2005). Компоновка с этими DLL MFC осуществляется неявно, через библиотеки импорта. Может быть, Вы думаете, что программа неявно связывается и с DLL, поддерживающими ActiveX и ODBC, но тогда все эти DLL подключались бы к клиентской программе при ее загрузке, независимо от того, используются ли на самом деле в ней средства ODBC или ActiveX. Но это не так. MFC загружает DLL-модули поддержки ActiveX и ODBC явно (через LoadLibrary) – при первом обращении к одной из их функций. Таким образом, Ваша клиентская программа загружает только нужные ей DLL. DLL-расширения: экспорт классов
Если DLL-расширение должно содержать только экспортируемые классы С++, то создать и использовать его будет легко. При использовании AppWizard Вы должны будете указать, что Вам необходимо DLL-расширение. Генерируемая AppWizard заготовка содержит одну лишь функцию DllMain(). Вы должны добавить в проект свои классы C++ и дополнить объявления классов макросом AFX_EXT_CLASS, как показано ниже: class AFX_EXT_CLASS CStudent : public CObject
Это изменение надо внести в h-файл, являющийся частью DLL-проекта, и в тот же файл, подключаемый клиентской программой. Другими словами, h-файлы для клиента и DLL должны совпадать. Макрос AFX_EXT_CLASS генерирует код в зависимости от ситуации: либо класс экспортируется из DLL, либо импортируется клиентом.
|
||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 471. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |