Темы блога относятся к программированию на языке С++
В основном для C++Qt (Qt5.1) и C++ Builder (RAD 2009 и RAD XE3)
В основном для C++Qt (Qt5.1) и C++ Builder (RAD 2009 и RAD XE3)
DLL в C++Builder и Microsoft Visual C++
Метки dll, lib, подключение библиотеки
Запись дорабатывается Проблемы взаимодействия Цитата:
Сложность использования dll, созданной с помощью Borland C++ Builder (далее BCB), в проектах, разрабатываемых в средах Microsoft, обусловлена тремя основными проблемами . Во-первых, Borland и Microsoft придерживаются разных соглашений о наименовании (naming convention) функции в dll. В зависимости от того, как объявлена экспортируемая функция, ее имя может быть дополнено компилятором определенными символами. Так, при использовании такого соглашения о вызове (calling convention), как __cdecl, BCB перед именем функции добавляет символ подчеркивания. Visual C++ (далее VC), в свою очередь, при экспорте функции как __stdcall добавит к ее имени помимо подчеркивания также информацию о списке аргументов (символ @ плюс размер списка аргументов в байтах).
Что нужно сделать для того что бы прикрутить вижуаловскую библиотеку: 1. Скачать эту самую билиотеку(динамической сборки). Как правило основу библиотеки составляют фалы c расширениями dll,lib и h. Копируем эти все файлы непосредственно в папку с проектом. 2. Произвести преобразование lib- файлов с помощью консольной утилиты coff2omf.exe поставляемой вместе с Builder-ом.Для этого заходим в меню Пуск->Выполнить (или win+R) cmd. - видим консоль Выполняем команду в консоли для перехода в папку проекта (что бы в дальнейшем не указывать полные пути ) : Код:
cd полный_путь_к_папке Код:
coff2omf x.lib x-bcb.lib
3. Подключаем х-bcb.lib к проекту.Это можно сделать такими способами: 3.1. Меню Project->Add To Project ( Shift+F11 ) и выбираем "х-bcb.lib" После этого либа должна появится Project Manager-е. 3.2. Добавить в код:
Возможные проблемы: 1. Дело в том что библиотеки могут включать в себя несколько заголовочных файлов и лежать при этом в отдельной папке и при этом могут возникать ошибки(допустим внутри x.h - заголовка библиотеки) указывая на строку типа
В этом случае необходимо прописать в опциях проекта в "инклюдах" путь к папке проекта (подразумевается что папка y- лежит именно там) 2. При компиляции пишит что-то вроде:
Так же для некоторых либ необходимо определить или (директивой #define) какую нибудь константу используемую этой библиотекой. Например при подключении shapelib необходимо было сделать следующее:
Узнать чего именно не хватает можно следующими способами: 1. Запустить exe-файл вашей программы- должно вылезти окошечко с указанием чего именно не хватает. 2. Использовать консольную утилиту tdump.exe для просмотра содержимого x.dll или вашего exe и просмотреть секцию импорта. Код:
tdump x.dll > tdump.txt 3. Использовать программу Dependency Walker. Затем следует поискать недостающие dll-ки в интернете,скачать их, и поместить их в папку с проектом, но при этом следуют учитывать версию dll-ки. Особенности: С++Builder обладает такой особенность которую следует учитывать при создании dll-лок и использовании в своем проекте dll написаных на VC:
Следует отметить что за добавления символа "_" отвечает опция показанная на скриншоте: Если установить эту опцию в false при создании dll, то в dll будут писаться функции без добавления подчеркивания впереди функции. Если установить эту опцию в false при создании проекта, то получим кучу ошибок по тому как Builder "перестает видеть" свои родные функции которые записаны с подчеркиванием. Литература: 1. Архангельский Приемы программирование в С++ Builder6 и 2006
4.2.5 DLL в C++Builder и Microsoft Visual C++
Если вы хотите создать DLL, которая могла бы в дальнейшем использоваться и в проектах C++Builder, и в проектах Microsoft Visual C++, надо принять для этого некоторые меры. Прежде всего, следите за тем, чтобы при создании библиотеки в окне рис. 4.3 была включена радио-кнопка VCC++ Style DLL. Это обеспечит возможность динамического связывания библиотеки с проектами Microsoft Visual C++. Методика динамического связывания библиотеки с приложением Visual C++ ничем не отличается от рассмотренной в раз. 4.2.4: библиотека загружается функцией LoadLibrary, адрес используемой функции определяется вызовом GetProcAddress, а выгружается библиотека функцией FreeLibrary. Но при статическом связывании DLL с приложением Microsoft Visual C++ некоторые проблемы могут возникнуть. Причина в том, что в C++Builder и в Microsoft Visual C++ приняты разные форматы экспорта функций: COFF и OMF. Так что вам придется несколько изменить информацию об экспортируемых функциях. Эту задачу позволяет решить утилита Impdef.exe, находящаяся в каталоге Bin вашей версии C++Builder. Утилита создает из указанного файла DLL текстовый файл описания с расширением .def, который вы далее можете редактировать. Первым параметром командной строки при вызове impdef передается имя создаваемого файла .def, а вторым — имя файла .dll. Например, если вы выполните команду: Код:
impdef.exe MyDLL.def MyDll.dll Код:
LIBRARY MYDLL.DLL EXPORTS @@Umydialog@Finalize @5 ; __linkproc__ Umydiaog::Finalize @@Umydialog@Initialize @4 ; __linkproc__ Umydiaog::Initialize _Code @3 ; _Code _DoBeep @2 ; _DoBeep _Form2 @7 ; _Form2 _MyDialog @1 ; _MyDialog ___CPPdebugHook @6 ; ___CPPdebugHook Если вы хотите преобразовать вашу DLL для работы с Microsoft Visual C++, надо удалить символы подчеркивания, с которых начинаются имена функций _Code, _DoBeep, _MyDialog. Теперь можно создать файл импортируемой библиотеки в формате Microsoft Visual C++. Это делается программой lib.exe, поставляемой вместе с Microsoft Visual C++. Вызвать ее надо командой: Код:
LIB /DEF:MyDLL.def Теперь рассмотрим обратную задачу — использование в проекте С++Вuiilder библиотеки, созданной в Visual C++. Имеется два пути решения этой задачи. Если вы имеете исходную импортируемую библиотеку .lib, то можете использовать утилиту coff2omf.exe, находящуюся в каталоге Bin вашей версии C++Builder. Через командную строку в нее передается имя файла исходной библиотеки и имя файла новой библиотеки. Конечно, эти имена должны быть различными или хотя бы различаться расширениями. Иначе вы испортите исходную библиотеку. Например, если имя исходной библиотеки VCLIB.lib, то вызов утилиты Coff20mf может иметь вид: Код:
сoff2omf VCLIB.lib VCLIB.tmp Если изложенный способ преобразования файлов не привел к успеху, или если вы не имеете файла .lib исходной библиотеки, имеется другой путь решения той же задачи. Создайте с помощью описанной выше утилиты Impdef файл описания .def и посмотрите в нем экспортируемые функции. Если строки описания функций имеют вид подобный следующему: Код:
_funcname@7 = _funcname @1 Код:
funcname=_funcname@7 Код:
Implib.exe VCLIB.lib VCLIB.def В целом, как видим, статическое связывание библиотек, созданных в разных системах, сопряжено с определенными сложностями. Так что надежнее всего использовать в этих случаях динамическое связывание. Тем более, что этот вариант имеет и ряд других преимуществ, описанных в предыдущих разделах. 2. Создание в среде Borland C++ Builder dll, совместимой с Visual C++ Темы: 1. Как использовать библиотеки, скомпилированные в Visual Studio, в Билдере? |
Всего комментариев 15
Комментарии
-
Запись от vxg размещена 25.07.2012 в 12:46 -
Запись от Avazart размещена 27.07.2012 в 08:36 -
Запись от Fulcrum_013 размещена 20.12.2014 в 08:58 -
Запись от Avazart размещена 22.12.2014 в 20:31
Обновил(-а) Avazart 22.12.2014 в 20:37 -
Запись от Alex_From_777 размещена 25.12.2015 в 13:56 -
Запись от Avazart размещена 25.12.2015 в 14:29 -
Запись от Alex_From_777 размещена 25.12.2015 в 14:38 -
Запись от Avazart размещена 25.12.2015 в 18:41
Обновил(-а) Avazart 25.12.2015 в 18:43 -
Запись от Dinkin размещена 20.12.2019 в 15:36
Обновил(-а) Dinkin 20.12.2019 в 15:37 -
Запись от Avazart размещена 20.12.2019 в 20:11 -
Запись от Dinkin размещена 03.01.2020 в 03:20 -
Запись от Avazart размещена 03.01.2020 в 21:25
Обновил(-а) Avazart 03.01.2020 в 21:27 -
Запись от Dinkin размещена 03.01.2020 в 21:38 -
Запись от Dinkin размещена 03.01.2020 в 21:40 -
Цитата:Я напишу на форуме поддержки tmssoftware и vmprotect, что бы подумали о своей нормальности =))))
Цитата:И кстати coff2omf работает только с 32x, как поступить с 64x приложениями?Запись от Avazart размещена 03.01.2020 в 21:56