![]() |
|
Модераторы: 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 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
представим, что у тебя есть информация о кол-ве и типах параметров. Что с этим делать в НЕскриптовом языке?
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
-------------------- undefined |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Я уже писал. При загрузке модуля (как dll так и so) начинает исполняться его стартап код (хотя dll можно загрузить не исполняя код, а вот с so не уверен). И что этот код сделает предсказать невозможно. Побочным эффектом может быть полное разрушение самой программы, которая его загрузила
|
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
так сейчас не модно, но это вполне возможно..
ну не я конечно начал эту тему, автору виднее есть смысл здесь или нет.. но я полагаю, такой иструмент мог бы быть полезен даже для своих плагинов, для которых как бы все известно.. статистика знаете ли.. -------------------- undefined |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
Народ, можете ответить: зачем это нужно (динамически получать кол-во и типы параметров) ???
ИМХО неважно, своя это длл-ка или чужая, т.к. без ассемблерных инъекций с этими данными делать нечего (если, конечно, это не питон или другой скриптовый язык). Разве что распечатать их... Просто для информации... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
прога растет, прога развивается, появляются новые версии плагинов.. думаю администратору, было бы полезно иметь инструмент который может точно определить подходит плагин к данной версии или нет.. это конечно можно сделать по номеру версии плагина, но это слишком категорично, бывает, что плагин не меняется на протяжении многих поколений программы, но бракуется как устаревший по версии.. ну и второй вариант, это предоставить информацию для сторонних разработчиков.. правда они могли бы и в документацию посмотреть, или непосредственно в исходник.. -------------------- undefined |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
fish9370, ясно. Я доксиженом для этого пользуюсь
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
а я уже говорил, что doxygen мой любимый инструмент? правда немного косячит, когда в одной папке есть несколько версий одного файла.. -------------------- undefined |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |