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

Замечание: в качестве второго параметра GetProcAddress может выступать как имя, указанное в .def-файле, так и порядковый номер (hint). Во втором случае следует преобразовать порядковый номер к типу LPCSTR с помощью макроса MAKEINTRESOURCE(x)

Для того чтобы собрать в VC++ dll, способную работать с исполняемым файлом от другого поставщика (Qt), нужно а) экспортировать имя функции без искажений (недекорированное) – сопоставить используемому в .dll имени псевдоним б) можно использовать порядковый номер (hint) в .def-файле. в) можно сопоставить совсем другое имя

Вместо (или наряду) конструкции __declspec(dllexport) Вы можете использовать файл определения модуля.

1)  создали новый проект (убрали __declspec(dllexport))

2)  добавили к проекту .def - файл

;.def

LIBRARY имя_dll_файла

EXPORTS имя_экспортируемой_функции/имя_экспортируемой_переменной [@hint]

или имя_экспортируемой_функции

3) В результате компоновки  (если к проекту подключен def-файл) создаются .lib и .exp-файлы (.exp- используется при взаимных вызовах функций dll и исполняемого файла)

Замечание: от def-файла можно избавиться, если в исходном коде dll использовать:

#pragma comment(linker, “/export:имя_функции=декорированное_имя_функции”)

Библиотеки, содержащие только ресурсы

4.4. dll - VC, содержащая только ресурсы

Любая функция в динамически подключаемой библиотеке, которую программы Windows или другие библиотеки могут использовать, должны экспортироваться. Однако, динамически подключаемая библиотека может не содержать никаких экспортируемых функций. Это может быть библиотека, содержащая только ресурсы

Для примера создадим:

4.4.1.  dll, содержащую иконки.

Последовательность действий:

1)  создайте новый проект типа Win32 Application Settings: .dll Empty project

2)  Add Resource – New или Import Icon

3)  Project/Properties/Linker/Advanced/No Entry Point – YES (тогда в командной строке компоновщику ключ /NOENTRY)

4)  Build

Замечание: при создании ресурсов с помощью графического редактора VS каждому ресурсу сопоставляется целый идентификатор, который автоматически формируется графическим редактором и заносится в файл проекта resource.h (обычно нумерация по умолчанию начинается с 101)

4.4.2. dll - и, содержащие строковые ресурсы на разных языках. Каждая dll содержит строчку «на своем» языке, но идентификаторы ресурсов для строк с одинаковым смыслом одни и те же. Например: «Hello», «Привет»

4.5. Клиент Qt

Рисуем иконку:

1)  Загрузить dll с помощью LoadLibrary() или LoadLibraryEx (лучше, так как есть возможность установить флаг LOAD_LIBRARY_AS_DATAFILE). К сожалению, класс QLibrary здесь не поможет!

2)  Если удалось загрузить библиотеку, достаем из нее иконку с помощью LoadIcon()

3)  Если удалось достать иконку, создаем объект QIcon с помощью QPixmap::fromWinHICON(HICON )

4)  Вызываем перерисовку - repaint();

5)  Не забудьте явно отключить библиотеку

6)  В обработчике события paintEvent отрисовываем иконку посредством QIcon::paint()

Выводим строчку на разных языках.

7)  загрузить строковый ресурс – LoadString() вывести текст