Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Импорт функций из dll / 13 сообщений из 13, страница 1 из 1
03.08.2005, 20:23
    #33200407
TnedutS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Привет всем!
Есть вопрос относительно использования dll.

Чтобы использовать функции dll, надо (при динамическом варианте)

descr = LoadLibrary("libAdr");
funcPointer= (functype)GetProcAddress(descr,"funcName")

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

А нельзя ли использовать функции, о существовании которых не знал до этого?
То есть использовать совершенно левую библиотеку.

Ситуация такая.
Есть мой exe файл.
При его запуске выскакивает консоль, в которой можно какие-то команды писать и параметры для команд.
Есть команды, которые я сам писал и они жестко вбиты в код программы.
"Если написано x, делай y"

Надо сделать так, чтобы работать с dll, которые сам же динамически и подгружаешь. Это не проблема (LoadLibrary). У меня это выглядит - в консоли пишешь :
ld< xxx
и загружается нужная библиотека xxx.

Пользователь знает, что в dll, которую он только что загрузил, есть функция
typeFunc add (typex x,typey y,typez z)
Он в консоли пишет :
add xx,yy,zz

Я считываю это, анализирую и должен написать по идее :
p = (typeFunc(*)(typex)(typey)(typez))getprocaddress(descr,"add")
И вызывать функцию через указатель p:
(*p)(xx,yy,zz);
Но вот тут проблема в том, что программа не знает заранее, что за тип будет у функции.
Если имя функции я узнаю от пользователя, то с типом не получается.
Неужели единственный вариант - это заставить пользователя и тип указывать?
(и возвращаемого значения, и параметров)

Есть способ лучше?
Итак, моя задача( идеал:) ) - не ограничивать набор возможных функций.

Надеюсь, понятно, объяснил проблему. Если нет, пишите - уточню, если что-то непонятно.
...
Рейтинг: 0 / 0
03.08.2005, 21:22
    #33200447
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Нууууу... можно попробовать объявлять функции с переменым набором параметров. Типа:
Код: plaintext
1.
2.
typedef void (imported_function)(...);
imported_function p = (imported_function)GetProcAddress(descr,"funcName");
p(i1, i2, i3);

Второй вариант, объявить функцию без параметров вообще, а вызов ее делать через ассемблерный кусок. Сначала вручную кладешь на стек параметры потом зовешь функцию. В конце сам же чистишь стек.
...
Рейтинг: 0 / 0
04.08.2005, 10:48
    #33200976
SeraTJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
На этапе компиляции тебе не удасться задать все возможные комбинации, так что выход единственный -- самому закидывать параметры в стек.

Хочется только добавить, что задача очень неприятная. Что будет если пользователь ошибется хотя бы в одном параметре? это будет такое...
К тому же придется определиться с размерами типов. К примеру, sizeof(int) = 2 или 4. Если тебе напишут func(int 88), сколько байтов ты будешь передавать?
...
Рейтинг: 0 / 0
04.08.2005, 11:13
    #33201062
TnedutS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Тогда еще вопрос.
А можно ли как-то это сделать с помощью статического подключеня dll?..

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

То есть, скажем, сделать так, чтобы при подключении новой dll с новой функциональностью надо было перекомпилировать программу с указанием для линкера новой lib.
То есть фиг с ним. Пусть нужна будет перекомпиляция.
Главное, чтобы не надо было менять кода программы.
Есть какое-то решение таким способом? Или обязательно в стек лезть придется?

Честно сказать, у меня опыта на эту тему пока, мягко говоря, недостаточно.
Я еще не делал ничего с ассемблерными вставками. Хотя в целом имею представление об ассме и его командах.
...
Рейтинг: 0 / 0
04.08.2005, 11:15
    #33201071
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Может сделать в ДЛЛ функцию, которая должна выдавать число параметров для каждой функции в ДЛЛ, ну и при вызове учитывать это.
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
04.08.2005, 11:44
    #33201184
TnedutS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
White OwlНууууу... можно попробовать объявлять функции с переменым набором параметров. Типа:
Код: plaintext
1.
2.
typedef void (imported_function)(...);
imported_function p = (imported_function)GetProcAddress(descr,"funcName");
p(i1, i2, i3);

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


По поводу первого варианта.
Вот объявил я такой указатель.
Но при компиляции то я не знаю, сколько со сколькими параметрами буду ее вызывать.
То есть будет
if(paramNumber == 1)
p(x1);
else if(paramNumber == 2)
P(x1,x2);

И так далее?

В принципе не так плохо. Тем более, параметров будет ну точно не больше 10.

Но как быть с типами?
Подбирать? Идея есть в принципе. Попробую сейчас.

2Карабас
Желательно без таких функций все же. Даже очень желательно.
Тем более что все же некоторые ограничения на число параметров, слава Богу, есть.
...
Рейтинг: 0 / 0
04.08.2005, 11:45
    #33201192
TnedutS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
TnedutS2Карабас
Желательно без таких функций все же. Даже очень желательно.
Тем более что все же некоторые ограничения на число параметров, слава Богу, есть.

То есть можно перебрать. Похоже, параметров будет не больше 5.
Ну с запасом (большим) - 10
...
Рейтинг: 0 / 0
04.08.2005, 11:51
    #33201224
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Тебе в любом случае при вызове функции надо знать кол-во параметров, а чтобы его знать, надо чтобы кто-то сказал, например, эта самая дополнительная функция, которая пишется при разработке ДЛЛ
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
04.08.2005, 11:55
    #33201243
TnedutS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Карабас БарабасТебе в любом случае при вызове функции надо знать кол-во параметров, а чтобы его знать, надо чтобы кто-то сказал, например, эта самая дополнительная функция, которая пишется при разработке ДЛЛ
Posted via ActualForum NNTP Server 1.2

Согласен.
Но пользователь при вводе в консоль задает параметры какие-то. Я собираюсь их просто посчитать.
А если он ошибся...
Не повезло ему:)
Вот с типами будет напряжнее. Хотя и решаемо. Надеюсь:)

Пользователь должен знать параметры и их число, так как предполагается, что он dllку и делал или , по крайней мере, читал описание dllки.
...
Рейтинг: 0 / 0
04.08.2005, 11:58
    #33201267
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
TnedutSА если он ошибся...
Не повезло ему:)В лучшем случае ... я если он умышленно ошибся ?
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
04.08.2005, 12:08
    #33201318
TnedutS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Карабас Барабас TnedutSА если он ошибся...
Не повезло ему:)В лучшем случае ... я если он умышленно ошибся ?
Posted via ActualForum NNTP Server 1.2

А для чего это ему может быть надо?
Защита от дураков еще понятно, но от людей с мазохистским уклоном...

Сейчас посмотрел. Ну при вызове не с теми параметрами программа просто некорректно заканчивает свою работу.
Сойдет.
Кстати, а можно это отлавливать try catch? Или нет?
Я с этим ничего не делал еще тоже...
...
Рейтинг: 0 / 0
04.08.2005, 15:32
    #33201979
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
первое впечатление - велосипед...
Данной идеи 100 лет в обед и назвываеться COM.
Рекомендую почитать про COM. Так и называеться книжка умная

"Основы COM"

там найдёте ответы на Ваши вопросы. Останеться только специфицировать интерфейс "описания". И вообще тогда пользователю не нуна будет указывать всю байду, типа наименований функций, кол-во параметров и их типизация.
Интерфейс - есть СОГЛАШЕНИЕ между Вашей программкой и внешними ДэЛеЛе.


удачи Вам
(круглый)
ЗЫ
...
Рейтинг: 0 / 0
04.08.2005, 15:39
    #33201997
Krolikoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт функций из dll
Есть еще вариент - передаешь в функцию строку а в ней уже все параметры. Каждый ДЛЛ будет знать как разгребать их. А возвращать можна форму, или что-то что может обобщить результат ... ну или же ту же строку ... в зависимости от задачи
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Импорт функций из dll / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]