Замечание: в качестве второго параметра 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:имя_функции=декорированное_имя_функции”)
Любая функция в динамически подключаемой библиотеке, которую программы Windows или другие библиотеки могут использовать, должны экспортироваться. Однако, динамически подключаемая библиотека может не содержать никаких экспортируемых функций. Это может быть библиотека, содержащая только ресурсы
Для примера создадим:
Последовательность действий:
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)
Рисуем иконку:
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() вывести текст
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.