Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

DLL-расширения и обычные DLL




 

До сих пор мы рассматривали DLL-модули Win32, в которых есть функция DllMain() и какие-то экспортируемые функции. Теперь двинемся в мир, построенный на каркасе MFC-приложений, расширяющем базовую поддержку DLL. AppWizard позволяет создавать два вида DLL с поддержкой MFC-библиотеки: DLL-расширения (extension DLL) и обычные DLL (regular DLL). Но прежде чем выбирать, надо разобраться в сути предмета.

 

Примечание. Конечно, Visual С++ позволяет создавать Win32 DLL без библиотеки MFC – так же, как и программы. Но так как здесь рассматривается MFC, то этот вариант мы пропустим.

 

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 для компилятора устанавливаются так, как показано в следующей таблице.

 

  Динамическое связывание с общей MFC-библиотекой Статическое связывание с MFC-библиотекой
Обычная DLL _AFXDLL,  _USRDLL _USRDLL
DLL -расширение _AFXEXT, _AFXDLL He поддерживается
Клиентская ЕХЕ-программа _AFXDLL Константы не определены

 

В 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; просмотров: 395.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...