Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование DLL 
:(
    Опции темы
dead_psh
  Дата 23.5.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Здравствуйте!

Возник такой вопрос:

Возможно ли подключить и вызвать функцию из библиотеки, если заранее не знаешь сколько и какие параметры у этой фцнкции. 

Например есть основное приложение main.exe а рядом с ним лежат dll, имена их найти не составит труда. В каждой dll есть функция, например, get_info(), которая возвращает имя основной функции в dll и ее параметры (например в структуре). 

Так как теперь объявить функцию по полученным данным?
PM MAIL   Вверх
Fazil6
Дата 23.5.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(dead_psh @  23.5.2007,  14:38 Найти цитируемый пост)
Возможно ли подключить и вызвать функцию из библиотеки, если заранее не знаешь сколько и какие параметры у этой фцнкции.

можно, но нужно организовывать это и в dll и в exe. Например делать стек, в него складывать аргументы и передавать ссылку на этот стек, а в dll доставать из него и складывать туда результат. 

PM MAIL   Вверх
EnergoHokum
Дата 23.5.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Насколько я понимаю, из дл-ок нельзя вызывать функции с неопределённым числом параметров. Посмотри на пару-тройку тем ниже, я рассказывал про использование дл-ок а именно про динамическое их подключение.

Добавлено через 9 минут и 12 секунд
To Fazil6 Т. е. руками делать то, что обычно делает компилятор (передавать аргументы и чистить стек)? А подробнее можно?
PM MAIL ICQ   Вверх
Daevaorn
Дата 23.5.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(EnergoHokum @  23.5.2007,  15:49 Найти цитируемый пост)
 (передавать аргументы и чистить стек)

стек можно реализовать и виртуальный. т.е. даже не стек, а некую систему передачи и возвращения параметров. но всё зависит от цели. понятно, что такой вариант проигрывает в скорости и, в некоторой степени, в удобстве.
PM MAIL WWW   Вверх
dead_psh
Дата 23.5.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Желательно способ как можно проще. Скорость - критерий для меня не великоважный. 

Если можно пожауйста пример или ссылочку, где лежит нечно подобное  smile 
PM MAIL   Вверх
Fazil6
Дата 23.5.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(EnergoHokum @  23.5.2007,  14:49 Найти цитируемый пост)
 А подробнее можно?

что именно подробнее? 
Проблема в том, что нужно вызывать из dll функцию с заранее неизвестной сигнатурой (сюда же можно и имя функции). Т.е. В dll реализуются некие экспортируемые функции с одинаковой известной сигнатурой. Каким-то заранее оговоренным интерфейсом (get_info()) можно получить информацию о именах этих функций их параметрах и возвращаемом значении. 
Т.е. для импорта этих функций в ехе нужно получить только имена функций ибо предполагается, что сигнатура их одинаковая и известна. Потом для вызова их нужно с формировать аргумент, который будет в вызываемой функцией разбираться для получения фактических ожидаемых аргументов.  Стек это будет или как-то подругому организовать...

Добавлено через 4 минуты и 2 секунды
Цитата(dead_psh @  23.5.2007,  15:08 Найти цитируемый пост)
Если можно пожауйста пример или ссылочку, где лежит нечно подобное

как такой механизм реализовывать зависит от нюансов. 

Например какого типа параметры должны передаваться : это встроенные типы или необходимо пользовательские типы передавать? Нужно ли обеспечить возможность того чтобы система работала вне зависимости от компиляторов и их версий у exe и dll ?
В чем вообще задача состоит?
PM MAIL   Вверх
dead_psh
Дата 23.5.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @  23.5.2007,  15:10 Найти цитируемый пост)
ибо предполагается, что сигнатура их одинаковая и известна.


хм...сигнатура функций в разных ДЛЛ разная...

Добавлено через 2 минуты и 40 секунд
Цитата(Fazil6 @  23.5.2007,  15:10 Найти цитируемый пост)
В чем вообще задача состоит?


Задача состоит в создании неких плагинов, которые можно добавлять к программе.
Передаваться в функцию будут int, char*, struct
PM MAIL   Вверх
EnergoHokum
Дата 23.5.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



А, ну то-есть, подобие COM получается? Должна быть хотя-бы одна функция, о которой известно всем. Так?
PM MAIL ICQ   Вверх
dead_psh
Дата 23.5.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Цитата(EnergoHokum @  23.5.2007,  15:18 Найти цитируемый пост)
А, ну то-есть, подобие COM получается? Должна быть хотя-бы одна функция, о которой известно всем. Так? 



есть! Писал же:


Цитата(dead_psh @  23.5.2007,  14:38 Найти цитируемый пост)
 В каждой dll есть функция, например, get_info(), которая возвращает имя основной


Сигнатура этой функции известна и одинаковая во всех длл!
PM MAIL   Вверх
Fazil6
Дата 23.5.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(dead_psh @  23.5.2007,  15:14 Найти цитируемый пост)
хм...сигнатура функций в разных ДЛЛ разная...

ну это понятно, что вызывать ты хочешь функции с разными сигнатурами, в противном случаевопрос не возникал бы. Так вот замени эти функции функциями с предопределенной сигнатурой. Например
Код

void f(void*)


а вызовом get_info() получать фактическую информацию о этой функции, например, что первый параметр int, а второй char.
При вызове этой функции выделяешь область памяти размером sizeof(int) + sizeof(char) и в нее записываешь сначала инт, а за ним char и передаешь адрес этой памяти в вызываемую функцию. Эта функция берет из этих адресов сначала int , за ним char и работает с ними.   
PM MAIL   Вверх
dead_psh
Дата 23.5.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @  23.5.2007,  15:26 Найти цитируемый пост)
При вызове этой функции выделяешь область памяти размером sizeof(int) + sizeof(char) и в нее записываешь сначала инт, а за ним char и передаешь адрес этой памяти в вызываемую функцию. Эта функция берет из этих адресов сначала int , за ним char и работает с ними. 

Вот кстати щас над этим и думал....Спасибо че нить намудрю щас 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.