Библиотеки. Клиент VC/ библиотека VC. Экспорт с помощью dllexport, страница 2

5)  запустили – можем при отладке «зайти» в функцию статической библиотеки

. DLL. Неявное связывание. Способы экспорта.

3. Экспорт с помощью dllexport

3.1. .dll VC

1)  Библиотека - тип проекта Win32 dll (можно тут же указать Wizard-у  - “Export Symbols”).

2)  Экспортировали требуемую функцию (по желанию + данное) __declspec(dllexport). Замечание: .h-файл рекомендуется модифицировать таким образом (с помощью директив условной трансляции), чтобы его можно было использовать как библиотекой, так и вызывающим приложением.

3)  Так как библиотека и клиент разработаны разными инструментами, следует экспортировать/импортировать по недекорированному имени

extern "C" {

#ifdef IMPLICIT

extern __declspec(dllexport) int Global_implicit;

__declspec(dllexport) int sub(int, int);

#else

extern Q_DECL_IMPORT int Global_implicit;

Q_DECL_IMPORT int sub(int, int);

#endif

}

4)  Для удобства можно направить вывод (то есть создание файлов .dll и .lib) в папку Debug тестового приложения – Project\Properties\General\Output directory (тогда компоновщик создаст dll, lib и exp-файлы в указанной директории)

5)  Лучше создавать Release-версию библиотеки (чтобы исключить вызов дополнительных  проверочных функций, которые генерируются в Debug-версии проекта)

6)  в результате компоновки должен быть создан а) .lib-файл, б) .dll-файл. Содержимое таблицы экспорта Вы можете посмотреть с помощью DumpBin имя.dll/EXPORTS. dumpbin.exe -out:t.txt -exports mydll.dll – в файл

3.2. Клиент Qt

·  Подключить заголовочный файл библиотеки

·  В проекте   указать путь к  h- файлу

INCLUDEPATH+= ../din_lib  - это рабочий каталог библиотеки

·   Компоновщику указать файл библиотеки импорта

LIBS+=  ../lib/din_lib.lib

·  Файл din_lib.dll должен находится в одной из тех директорий, где загрузчик ОС сможет его найти!

DLL. Явное связывание. Способы экспорта.

4.  

4.1. dll VC - dllexport

по аналогии с предыдущим заданием.

Замечания:

1.  Заголовочный файл клиентом использоваться не будет => не обязателен

2.  Понятия предназначены только для экспорта из библиотеки

3.  Release-версия dll

4.2. Клиент - Qt

Загрузка и использование dll осуществляется с помощью класса QLibrary:

1.  QLibrary dll(QString(<спецификация_dll>));

2.  Проверить: удалось ли загрузить dll, можно с помощью метода  QLibrary:: isLoaded()

3.  После того, как библиотека загружена, нужно получить из нее адрес требуемой функции посредством метода QLibrary:: resolve()

4.  Если удалось добыть адрес, преобразовать возвращенное значение к требуемому типу

5.  Вызвать функцию

6.  Нужно ли явно освобождать библиотеку, загруженную таким способом???

Замечание 1: имя функции должно соответствовать имени, импортируемому из dll (а в dll оно может быть декорировано компилятором!!!)

Замечание 2: в качестве возвращаемого GetProcAddress() значения может выступать указатель на экспортируемое данное

4.3. dll VC - использование DEF-файлов