![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
magesi |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
Привет всем!
Цель моего вопроса: как вызвать экспортируемую функцию из какой-то библиотеки? Я предварительно пока беру адрес той или иной ф-ции из dll ( к примеру, возьмем openal32.dll ) из программ dlldump/dependecy walker и потом пытаюсь по адресу вызвать данную ф-цию. Мой пример:
Я взял для примера ф-цию alEnable(int) из OpenAL32, ее входная точка ( Entry Point ) - 0x00003870 Столкнулся на самом вызове... Вроде бы, определил тип typedef void (uef)(); и хотел потом вызвать, но компилер выдает:
Я раньше уже делал вызов функции по адресу, но забыл.... И такой еще вопрос: является ли адрес опред. ф-ции в той или иной dll всегда статичным ( одиним и тем же ) или адреса экспортируемых ф-ций в одной и той же либе, на одной и той же ОС, могут быть разными при след. запуске ОС? Подскажите пожалуйста и по данному моменту, спасибо! PS Хотя по ошибке: 'uef (__cdecl *)' to 'uef' , вспоминается про stdcall .... Но вспомнить не могу , пока гуглю, но не нашел что-то вразумительного... Заранее спасибо за помощь! Это сообщение отредактировал(а) magesi - 11.6.2012, 12:45 |
||||
|
|||||
magesi |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
Хотя спасибо!
Уже не надо, сделал так:
|
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
А что это вообще за извращение?
Что мешает сделать: __declspec(dllimport) void __stdcall alEnable(int); ? И подрубить дллку к линкеру. Это сообщение отредактировал(а) Randajad - 11.6.2012, 08:21 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это называется динамическим связыванием. |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Я понимаю, но, по-моему, нужны веские причины для него.
![]() |
|||
|
||||
magesi |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
И какие же, к примеру, веские могут быть, а какие не могут быть вескими? Добавлено @ 12:24
а как Вы адрес экспортируемой ф-ции в runtime собрались этим вычислять или как? Это сообщение отредактировал(а) magesi - 11.6.2012, 12:32 |
||||
|
|||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Пожалуйста: делается программа с плагинами. Один плагин - одна dll-ка. На этапе разработки программы неизвестно количество и наименование dll-к. Как тут обойтись без динамического связывания - хз. Вот пример на псевдокоде, объясняющий то, что я хотел сказать на русском )))
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
magesi |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
foreach уж юзали бы в псевдокоде ![]() PluginInitFunc - ф-ции могут быть разными и иметь разное кол-во аргументов , как и разн. возвращющий тип, каждый раз переопределять PluginInitFunc? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Для каждого типа пишется свой typedef к типу. Ты же не можешь создать массив из разных указателей на функцию. Вообще-то для плагинов экспортируемые функции д.б. одинаковыми. Если же ты импртируешь разные функции одной dll-ки, то действительно - проще подключить в проект lib-ину импорта, сделать на каждую функцию описание с __declspec(dllimport) вначале, а потом не парясь их вызывать, как-будто они определены в другом cpp-шнике. Проще ведь... на то он и псевдокод ![]() Это сообщение отредактировал(а) borisbn - 11.6.2012, 13:33 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
magesi |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
Был-бы свой RTTI для таких целей бы ![]() Это сообщение отредактировал(а) magesi - 11.6.2012, 13:40 |
|||
|
||||
magesi |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
Хотя, стоп! Сейчас модно очень при разработке продукта использовать один исполняемый файл и ничего более в директории приложения ( как Skype ). Dll грузятся в Resource, заранее составляется таблица адресов той или иной ф-ции и вызывается. |
||||||
|
|||||||
magesi |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
1). Самый ярый пример уже был приведен - Skype. 2). Метод c LockBytes в исполнеяемом файле актуально моден.
Вы, что ли, в школе еще учитесь или в универе? Что за лексика? Зад какой-то... С Вами прилично разговаривают и не принебрегают моралью. Если, Вам тема не нравится, то просто игнорируйте, зачем какой-то быдло-стиль общения использовать без конца? Вы себя не красите, а только указываете на уровень собственной культуры рекурсивно, что она достаточно бедна. Не нравится - не отвечайте, зачем про какие-то зады писать? Тем более, метод действительно актуален, и пример одного из самых популярных ПО, я предоставил, это проверяется легко. Embedded стиль насегодня, действительно, стал рентабельным, чем размножение на многие файлы, это и асимптотически даже видно. Это сообщение отредактировал(а) magesi - 11.6.2012, 21:22 |
||||
|
|||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Да, про плугины не подумал. Но для того случая, что привел автор, этот код не нужен.
![]() P.S. просто не так давно писал внедрение dll'ки из памяти в экзешку и запуск потока в оном приложении. ![]() Про цель умолчу. ![]() |
|||
|
||||
magesi |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
||||
|
||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
magesi
ТС ну включите мозг, откуда ваш ехешник может знать о 1) и самое главное о кол-ве параметров функции 2) о названии ф-ции в таблице экспорта хрен с ним оставим в покое пункт 2, там все работает просто, перебором но пункт 2, вы так просто не определите для написания плагинов надо изобрести всего на просто свое определение ызова функ ну к примеру каждая функ имеет 6 параметров, если у функ 4 парам используются то остальные 2 типа равны = 0 это как грубый пример а про инжекты дллек в ехе, это мовитон по ряду причин. Это сообщение отредактировал(а) Daevaorn - 12.6.2012, 13:09 -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |