Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> узнать как взаимодействует exe и dll 
:(
    Опции темы
mrgloom
Дата 16.1.2013, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



есть программа .exe  и .dll к ней к которой она обращается, исходников нет.
хотелось бы использовать .dll в своей программе.

возможно ли это и как это сделать? 
PM MAIL   Вверх
drug007
Дата 16.1.2013, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Конечно можно. Вам нужно только знать имена функций и их аргументы. Имена узнать в принципе не сложно, есть инструменты (на память помню только implib у digital mars компилятора и dlltool у mingw), а вот насчет аргументов... Длл без проблем можно юзать если есть заголовочный файл. А вот без оного нужно будет некий реинжиниринг делать. Но проблема решаема с большой вероятностью. Муторное дело. Кстати, мой Вам совет - поспрашивайте на эту тему в других языках кто часто биндинги делает - они точно в курсе как пользовать чужую dll, часто с этим сталкиваются. 
MinGW в этом плане хорошо - он может слинковать сразу с dll библиотекой, но заголовочный файл нужен чтобы скомпилировать в любом случае. Т.е. вкратце нужно будет какими-то средствами получить список функций и параметры аргументов, сделать заголовочный файл и можно компилировать, а линковать уже с dll. Если мелкомягкий компилятор используете, то не знаю точно, но вроде нужно будет lib файл для dll еще создать и линковать с ним.

Это сообщение отредактировал(а) drug007 - 16.1.2013, 12:44
PM MAIL   Вверх
mrgloom
Дата 17.1.2013, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


PM MAIL   Вверх
mrgloom
Дата 17.1.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



опять же вопрос  имеет ли значение на каком языке написана dll и каким компилятором собрана?
PM MAIL   Вверх
Dem_max
Дата 17.1.2013, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



нет не имеет 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
drug007
Дата 17.1.2013, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(mrgloom @  17.1.2013,  09:31 Найти цитируемый пост)
вот допустим была у меня dll от которой есть исходный код на delphi посмотрел я её через dependency walker, а там только 1 функция createinstance и никакого намека на экспортируемые функции.

хотя если посмотреть .exe который имеет зависимость от этой .dll, то там как раз будет список функций, ну остается только понять какие у них параметры, непонятно можно ли узнать тип или только размер?

нашел вот еще, но там нет прямых ответов
http://stackoverflow.com/questions/554551/...-without-header
http://stackoverflow.com/questions/6997372...-without-header

Просто библиотека может экспортировать не все функции, что в ней есть. В этом случае Вы не сможете штатными средствами слинковать с ней. Но у Вас случай все равно нештатный, поэтому не страшно - все равно руками придется все искать. В первой ссылке, кстати, отвечают как узнать размер аргументов и их количество, правда указано, что с возвратом значения из функции могут быть проблемы. Тут я не подсказчик. Насчет типа - на уровне ассемблера типа нет как такового, есть только размер. А по размеру Вы уже сами должны определить тип. Но путать float с int не стоит.


Цитата(mrgloom @  17.1.2013,  10:51 Найти цитируемый пост)
опять же вопрос  имеет ли значение на каком языке написана dll и каким компилятором собрана?

Имеет, но ничего сложного не представляет - некоторые компиляторы добавляют символ почерка к названиям функций, некоторые нет, но решаемо достаточно легко через библиотеки импорта. С этим сталкиваются только когда работают нештатными средствами - как в Вашем случае, т.е. это проблема не самих библиотек, а проблема разных toolchain'ов - для одной и той же dll разные компиляторы будут требовать разных библиотек импорта и они будут разными. Вообще же длл ориентированы на независимость от компилятора и языка и у них это получается очень хорошо, к счастью.
PM MAIL   Вверх
mrgloom
Дата 17.1.2013, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата

How do I view the parameter and return types of a function?
    For most functions, this information is simply not present in the module. The Windows' module file format only provides a single text string to identify each function. There is no structured way to list the number of parameters, the parameter types, or the return type. However, some languages do something called function "decoration" or "mangling", which is the process of encoding information into the text string. For example, a function like int Foo(int, int) encoded with simple decoration might be exported as _Foo@8. The 8 refers to the number of bytes used by the parameters. If C++ decoration is used, the function would be exported as ?Foo@@YGHHH@Z, which can be directly decoded back to the function's original prototype: int Foo(int, int). Dependency Walker supports C++ undecoration by using the Undecorate C++ Functions Command.


так получается, что разница есть на каком языке написано и какой компилятор был использован.
http://en.wikipedia.org/wiki/Name_mangling
PM MAIL   Вверх
drug007
Дата 17.1.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(mrgloom @  17.1.2013,  16:40 Найти цитируемый пост)
так получается, что разница есть на каком языке написано и какой компилятор был использован.

Да, манглинг никто не отменял, про него я и упоминал. Но Вы можете использовать средства ОС для загрузки библиотеки и поиска указателя на функцию по ее имени. А дальше вызывать эту функцию по указателю. Вообще динамическая загрузка наиболее простой и надежный вариант будет, хотя кода будет побольше немного. На мой взгляд основная проблема это возврат значения функцией - так как я только делал биндинги с заголовочными/интерфейсными файлами, то здесь я не подскажу, опыта нет.
PM MAIL   Вверх
bsa
Дата 17.1.2013, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



drug007, вообще-то, самая большая проблема - это методы классов с++. Динамическая загрузка тут бесполезна - без описания класса все равно использовать не выйдет, даже если компилятор тот же.
PM   Вверх
drug007
Дата 18.1.2013, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(bsa @  17.1.2013,  19:21 Найти цитируемый пост)
drug007, вообще-то, самая большая проблема - это методы классов с++. Динамическая загрузка тут бесполезна - без описания класса все равно использовать не выйдет, даже если компилятор тот же. 

Это да, но здесь проблема манглинга и она не решается, если работать стандартными средствами. Так как у ТС все равно нет заголовочного файла и придется много ручками поработать, ничто не мешает ему найти имена мемберов класса и напрямую их загружать. Обычно такие вопросы решаются через сишный интерфейс - т.е. создается еще одна либа, которая экспортирует сишные функции, которые вызывают уже код на плюсах. Но это опять же если есть заголовочные файлы. А тут выход один - руками просмотреть либу, выписать имена функций и загружать их напрямую. А уже в программе можно дать указателю на функцию более осмысленное имя. А аргументы смотреть по асм-коду. В любом случае задача не тривиальная.
PM MAIL   Вверх
mrgloom
Дата 18.1.2013, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



ну мне по любому нужен какой то инструмент, т.к. копаться руками в этом всём нет ни навыков ни желания.

поробовал это, но она падает.
http://boomerang.sourceforge.net/

вроде еще есть IDA Pro, но её еще достать надо.
как я понял, там даже можно восстановить код, а не только описание функций (но непонятно автоматически ли?)
http://www.hex-rays.com/products/decompiler/index.shtml
PM MAIL   Вверх
bsa
Дата 18.1.2013, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



mrgloom, может проще обратиться к производителю библиотеки и получить полноценный SDK?
PM   Вверх
mrgloom
Дата 18.1.2013, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



дело в том, что я хочу использовать dll от демоверсии, которой мне вполне хватит.
СДК вроде бы существует, но возможно там функции не совпадают с теми что в dll от демоверсии или замаскированы.

да и вообще ради интереса как это всё устроено хотелось разобраться.

Это сообщение отредактировал(а) mrgloom - 18.1.2013, 15:19
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.