![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| dead_psh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.3.2007 Репутация: нет Всего: нет |
Здравствуйте!
Возник такой вопрос: Возможно ли подключить и вызвать функцию из библиотеки, если заранее не знаешь сколько и какие параметры у этой фцнкции. Например есть основное приложение main.exe а рядом с ним лежат dll, имена их найти не составит труда. В каждой dll есть функция, например, get_info(), которая возвращает имя основной функции в dll и ее параметры (например в структуре). Так как теперь объявить функцию по полученным данным? |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
можно, но нужно организовывать это и в dll и в exe. Например делать стек, в него складывать аргументы и передавать ссылку на этот стек, а в dll доставать из него и складывать туда результат. |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Насколько я понимаю, из дл-ок нельзя вызывать функции с неопределённым числом параметров. Посмотри на пару-тройку тем ниже, я рассказывал про использование дл-ок а именно про динамическое их подключение.
Добавлено через 9 минут и 12 секунд To Fazil6 Т. е. руками делать то, что обычно делает компилятор (передавать аргументы и чистить стек)? А подробнее можно? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| dead_psh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.3.2007 Репутация: нет Всего: нет |
Желательно способ как можно проще. Скорость - критерий для меня не великоважный.
Если можно пожауйста пример или ссылочку, где лежит нечно подобное |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
что именно подробнее? Проблема в том, что нужно вызывать из dll функцию с заранее неизвестной сигнатурой (сюда же можно и имя функции). Т.е. В dll реализуются некие экспортируемые функции с одинаковой известной сигнатурой. Каким-то заранее оговоренным интерфейсом (get_info()) можно получить информацию о именах этих функций их параметрах и возвращаемом значении. Т.е. для импорта этих функций в ехе нужно получить только имена функций ибо предполагается, что сигнатура их одинаковая и известна. Потом для вызова их нужно с формировать аргумент, который будет в вызываемой функцией разбираться для получения фактических ожидаемых аргументов. Стек это будет или как-то подругому организовать... Добавлено через 4 минуты и 2 секунды
как такой механизм реализовывать зависит от нюансов. Например какого типа параметры должны передаваться : это встроенные типы или необходимо пользовательские типы передавать? Нужно ли обеспечить возможность того чтобы система работала вне зависимости от компиляторов и их версий у exe и dll ? В чем вообще задача состоит? |
|||
|
||||
| dead_psh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.3.2007 Репутация: нет Всего: нет |
хм...сигнатура функций в разных ДЛЛ разная... Добавлено через 2 минуты и 40 секунд Задача состоит в создании неких плагинов, которые можно добавлять к программе. Передаваться в функцию будут int, char*, struct |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
А, ну то-есть, подобие COM получается? Должна быть хотя-бы одна функция, о которой известно всем. Так?
|
|||
|
||||
| dead_psh |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.3.2007 Репутация: нет Всего: нет |
есть! Писал же:
Сигнатура этой функции известна и одинаковая во всех длл! |
||||
|
|||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
ну это понятно, что вызывать ты хочешь функции с разными сигнатурами, в противном случаевопрос не возникал бы. Так вот замени эти функции функциями с предопределенной сигнатурой. Например
а вызовом get_info() получать фактическую информацию о этой функции, например, что первый параметр int, а второй char. При вызове этой функции выделяешь область памяти размером sizeof(int) + sizeof(char) и в нее записываешь сначала инт, а за ним char и передаешь адрес этой памяти в вызываемую функцию. Эта функция берет из этих адресов сначала int , за ним char и работает с ними. |
|||
|
||||
| dead_psh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.3.2007 Репутация: нет Всего: нет |
Вот кстати щас над этим и думал....Спасибо че нить намудрю щас |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |