Как вызвать неизвестную подпрограмму из неизвестной динамической библиотеки?
Обычно подключение динамической библиотеки ничем не отличается от статической - просто надо включить заголовок (и использовать правильное название (и подпись) попрограммы/класса ) и указать компилятору на динамическое подключение.
Есть возможность и выбирать нужную динамическую библиотеку в процессе вычисления, но опять таки нужно знать правильные названия!
Так вот задача:
Как в момент вычисленй узнать по любой (заранее неизвестной) динамической библиотеке (в windows dll-файлу, в Unix - so-файлу, ...) список включённых в неё подпрограмм со всем необходимым для вызова?
Как узнать содержание произвольной динамической библиотеки в момент вычисления?
P.S. Надеюсь , что хоть вопрос понять можно ...
Мой интерес чисто академический. Подобную функцию легко "осуществить", если в каждую динамическую библиотеку включить дополнительную функцию, например,
void header(char *);
результатом работы которой было бы формирование текста, соответствующего заголовочному файлу с опущенными директивами препроцессора и коментариями...
Если заблуждаюсь - скажите в чём ...
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);
наиболее подходящее, что смог вспомнить :)
Да нет, ты непонял, ему _все_ функции нужны. Я лично только могу посоветовать ковыряться в недрах формата PE (или Elf для *nix) и искать все функции ручками. А параметры... ну можно анализировать код, смотрерть сколько функция стека забивает... но это уже из области фантастики... (хотя Ida же вон анализирует;)
ЗЫ : если сильно инересует, пиши в лычку, у меня уйма документации по этой теме :cool:
В винде можно анализировать таблицу экспорта библиотеки.
но как её решать у меня идей нету. ковыряться в зоголовках исполнимых файлов... ну может быть. думаю что есть более культурные варианты
P.S. Честно говоря мне это кажется слегка противоречащем здравому смыслу ибо
1. операционная система как-то сверяет правильность названия и подписи вызываемой подпрограммы, а значит необходимая информация в сам формат представления динамической библиотеки включена,
2. отсутствие такого стандартного системного вызова вообще говоря слегка затрудняет повторное использование библиотеки, а ведь именно в целях повторного использования она и создана.
Единственно можно предположить, что общедостпность данной функции вызывает проблемы связанные с компьютерной безопасностью ...
А в целом спасибо за ответы!
Ознакомься с форматом PE, а конкретно с секцией экспорта.
Из неё ты узнаешь о названиях экспортируемых функций.
Количество же и тип передаваемых параметров в общем случае узнать не имея соотв. описания нельзя.