![]() |
|
Модераторы: xvr |
![]()
|
|
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
всем доброго вечера.
для моего меганавороченного менеджера плагинов, хочу добавить возможность получения информации об экспортируемых функциях. 1. имена экспортируемых функций. 2. возвращаемый тип. 3. кол-во и типы аргументов. подскажите куда копать. OS: win32/*nix спасибо. зы просьба к модераторам. не могли бы вы создать зеркало в разделе "C/C++: Системное программирование и WinAPI" ;) спасибо. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
вообще никак (если только самим не формировать нужную информацию)
хотя можно посмотреть в сторону dwarf2 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
с именами все просто. (я про венду) нужно копать таблицу экспорта, в PE формате. PE-формат это формат исполнимых файлов, (Portable Executible) а вот с этим посложней будет. В общем случае не возможно. Но если экспортируемые функции С++ замангленные, то можно частично еще кое-какую инфу извлечь. Если же не замангленные, то дохлый номер, только имена. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
нет. экспортируемые функции - Си. а то, что они выполняют внутри, может быть и с++. вообще, не думал что с этим такая проблема... Добавлено @ 23:36 т.е. что-то типа такого: void* create_object(name) {} void* create_object1(name, arg1) {} void* create_object2(name, arg1, arg2) {} ... void delete_object(void*) {} Добавлено @ 23:38 таки что, придется самому генерить инфу об предоставляемых объектах... Это сообщение отредактировал(а) boostcoder - 9.9.2011, 23:38 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
Тогда только имена, без вариантов. Походу, с замангленными С++ тоже бы пришлось не сладко, там их надо было бы разманглить. Теоретически в них зашифрованы типы аргументов и возвращаемого значения, но это теоретически. Практически пришлось бы неслабо позаниматься сексом, чтобы извлечь эту информацию. (общепринятых стандартов там нет)
да, это единственно нормальный способ. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
расстроился я что-то... оптимизма реализовать получение информации об экспортируемых функциях что-то поубавилось
Это сообщение отредактировал(а) boostcoder - 10.9.2011, 00:18 |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
boostcoder, что - то похожее я узнавал про dll, но получить информацию об аргументах - ПРОБЛЕМА
http://forum.vingrad.ru/forum/topic-302230...rocaddress.html Добавлено через 9 минут и 5 секунд вроде как народ советовал смотреть в сторону http://en.wikipedia.org/wiki/Name_mangling но это не дало мне особых результатов |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
а что если, по стандартному методу?
- открываем объектный модуль (so/dll) и запрашиваем информацию об экспортируемых символах и закрываем обратно.. другой вопрос, что объектник может ничего не экспортировать, при этом сам будет себя регистрировать в ядре программы.. в таком случае лучше всего, наверно, предусмотреть символ (функцию), которая будет возвращать информацию о плагине.. хотя и вариант, с регистрацией в ядре спецальной функции очень часто встречается, но его минус - невозможность получить информацию извне программы.. -------------------- undefined |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Черевато и получаем SIGFAULT, после чего весь мэнэджер плагинов падает с грохотом |
|||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
а если поработать в направлении поиска операций со стеком? так, по идее, можно хотябы узнать размеры аргументов. еще бы возможность отличить значение от указателя.. |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: нет Всего: 19 |
Никаких стандартных способов получения этой информации нет. Нужно придумать универсальный плагинный интерфейс и по нему получать и список функций, и информацию о типах. Возможно будет намного проще в качестве аргументов экспортируемых функций использзовать только variant-ы, тогда информация о параметрах банально ограничится числом передаваемых параметров. Еще я поглядела твои темы, по-моему ты хочешь очень много динамики от статичного С++. Это конечно все можно сделать (и даже в виде патчей к компилятору, хе-хе), но семантически и синтаксически пользоваться и сопровождать, в т.ч. третьими лицами, это будет очень тяжело. Почему бы не воспользоваться более динамичными языками и вынести критические участки в с++?
-------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
уже работаю в этом направлении. не-не-не наоборот. я всегда стараюсь использовать статическую типизацию везде где только можно. и рантайм переносить в компайлтайм. по возможности как можно больше. наверное ты про эту тему? но так тема про добавление в с++ таких прелестей как reflection и introspection. а это невероятно восстребованно если знать как и для чего использовать. меня, с++ устраивает всем. но не устраивает отсутствием стандартной_сериализации, reflection и introspection Это сообщение отредактировал(а) boostcoder - 12.9.2011, 16:46 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |