![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
есть программа .exe и .dll к ней к которой она обращается, исходников нет.
хотелось бы использовать .dll в своей программе. возможно ли это и как это сделать? |
|||
|
||||
drug007 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 3.11.2011 Репутация: нет Всего: 1 |
Конечно можно. Вам нужно только знать имена функций и их аргументы. Имена узнать в принципе не сложно, есть инструменты (на память помню только implib у digital mars компилятора и dlltool у mingw), а вот насчет аргументов... Длл без проблем можно юзать если есть заголовочный файл. А вот без оного нужно будет некий реинжиниринг делать. Но проблема решаема с большой вероятностью. Муторное дело. Кстати, мой Вам совет - поспрашивайте на эту тему в других языках кто часто биндинги делает - они точно в курсе как пользовать чужую dll, часто с этим сталкиваются.
MinGW в этом плане хорошо - он может слинковать сразу с dll библиотекой, но заголовочный файл нужен чтобы скомпилировать в любом случае. Т.е. вкратце нужно будет какими-то средствами получить список функций и параметры аргументов, сделать заголовочный файл и можно компилировать, а линковать уже с dll. Если мелкомягкий компилятор используете, то не знаю точно, но вроде нужно будет lib файл для dll еще создать и линковать с ним. Это сообщение отредактировал(а) drug007 - 16.1.2013, 12:44 |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
вот допустим была у меня dll от которой есть исходный код на delphi посмотрел я её через dependency walker, а там только 1 функция createinstance и никакого намека на экспортируемые функции.
хотя если посмотреть .exe который имеет зависимость от этой .dll, то там как раз будет список функций, ну остается только понять какие у них параметры, непонятно можно ли узнать тип или только размер? нашел вот еще, но там нет прямых ответов http://stackoverflow.com/questions/554551/...-without-header http://stackoverflow.com/questions/6997372...-without-header |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
опять же вопрос имеет ли значение на каком языке написана dll и каким компилятором собрана?
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
нет не имеет
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
drug007 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 3.11.2011 Репутация: нет Всего: 1 |
Просто библиотека может экспортировать не все функции, что в ней есть. В этом случае Вы не сможете штатными средствами слинковать с ней. Но у Вас случай все равно нештатный, поэтому не страшно - все равно руками придется все искать. В первой ссылке, кстати, отвечают как узнать размер аргументов и их количество, правда указано, что с возвратом значения из функции могут быть проблемы. Тут я не подсказчик. Насчет типа - на уровне ассемблера типа нет как такового, есть только размер. А по размеру Вы уже сами должны определить тип. Но путать float с int не стоит.
Имеет, но ничего сложного не представляет - некоторые компиляторы добавляют символ почерка к названиям функций, некоторые нет, но решаемо достаточно легко через библиотеки импорта. С этим сталкиваются только когда работают нештатными средствами - как в Вашем случае, т.е. это проблема не самих библиотек, а проблема разных toolchain'ов - для одной и той же dll разные компиляторы будут требовать разных библиотек импорта и они будут разными. Вообще же длл ориентированы на независимость от компилятора и языка и у них это получается очень хорошо, к счастью. |
||||
|
|||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
так получается, что разница есть на каком языке написано и какой компилятор был использован. http://en.wikipedia.org/wiki/Name_mangling |
|||
|
||||
drug007 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 3.11.2011 Репутация: нет Всего: 1 |
Да, манглинг никто не отменял, про него я и упоминал. Но Вы можете использовать средства ОС для загрузки библиотеки и поиска указателя на функцию по ее имени. А дальше вызывать эту функцию по указателю. Вообще динамическая загрузка наиболее простой и надежный вариант будет, хотя кода будет побольше немного. На мой взгляд основная проблема это возврат значения функцией - так как я только делал биндинги с заголовочными/интерфейсными файлами, то здесь я не подскажу, опыта нет. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
drug007, вообще-то, самая большая проблема - это методы классов с++. Динамическая загрузка тут бесполезна - без описания класса все равно использовать не выйдет, даже если компилятор тот же.
|
|||
|
||||
drug007 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 3.11.2011 Репутация: нет Всего: 1 |
Это да, но здесь проблема манглинга и она не решается, если работать стандартными средствами. Так как у ТС все равно нет заголовочного файла и придется много ручками поработать, ничто не мешает ему найти имена мемберов класса и напрямую их загружать. Обычно такие вопросы решаются через сишный интерфейс - т.е. создается еще одна либа, которая экспортирует сишные функции, которые вызывают уже код на плюсах. Но это опять же если есть заголовочные файлы. А тут выход один - руками просмотреть либу, выписать имена функций и загружать их напрямую. А уже в программе можно дать указателю на функцию более осмысленное имя. А аргументы смотреть по асм-коду. В любом случае задача не тривиальная. |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну мне по любому нужен какой то инструмент, т.к. копаться руками в этом всём нет ни навыков ни желания.
поробовал это, но она падает. http://boomerang.sourceforge.net/ вроде еще есть IDA Pro, но её еще достать надо. как я понял, там даже можно восстановить код, а не только описание функций (но непонятно автоматически ли?) http://www.hex-rays.com/products/decompiler/index.shtml |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
mrgloom, может проще обратиться к производителю библиотеки и получить полноценный SDK?
|
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
дело в том, что я хочу использовать dll от демоверсии, которой мне вполне хватит.
СДК вроде бы существует, но возможно там функции не совпадают с теми что в dll от демоверсии или замаскированы. да и вообще ради интереса как это всё устроено хотелось разобраться. Это сообщение отредактировал(а) mrgloom - 18.1.2013, 15:19 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |