Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2009, 03:49   #1
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию импорт функций из длл

вобщем использую интерпретатор, мне нужно из скрипта вызывать функции из длл, причем любой длл. Тут у меня проблема с реализацией, из за того что нужно всегда иметь прототипы этих фий. Вобщем не хотелось бы писать все возможные прототипы. Можеть кто то сталкивался с такой проблемой? как можно вызвать денамически импортированную ф-ию без прототипа? Можеть есть способ? можеть ассемблерный код поможет - типо стек?
user_jasser вне форума Ответить с цитированием
Старый 30.03.2009, 08:48   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

загружай динамически DLL и вызывай функцию через ассемблерные вставки.
кстати, я тоже пишу небольшой скриптовый движок, собираюсь сделать так чтобы все прототипы функций были одинаковыми. Как вариант: у всех функций два параметра. Первый параметр задаёт количество параметров, а второй это указатель на массив параметров.
rpy3uH вне форума Ответить с цитированием
Старый 30.03.2009, 09:02   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Грузин - интересно, надо будет и себя в этой сфере попробовать как будет время.
А по делу, ведь каждая функция это просто адресс в памяти. Т.е.
push вызывите с указаниями параметров а потом call и адрес этой функции. Порядок подачи параметров в стек зависит от дериктив например в винде принято Stdcall. т.е. справо на лево если смотреть как наобычную функцию. (если память не подводит).
Пробуйте.
BOBAH13 вне форума Ответить с цитированием
Старый 30.03.2009, 09:21   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

обычно у всех нормальных DLL функции вызываются по соглашению stdcall.

[OFFTOP]
Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Грузин - интересно, надо будет и себя в этой сфере попробовать как будет время.
всмысле?
rpy3uH вне форума Ответить с цитированием
Старый 30.03.2009, 09:36   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну
Цитата:
кстати, я тоже пишу небольшой скриптовый движок
вот и я пишу, что надо будет попробовать себя в этой сфере, написать подобное, у меня такой подход к обучению
BOBAH13 вне форума Ответить с цитированием
Старый 31.03.2009, 02:22   #6
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

Цитата:
загружай динамически DLL и вызывай функцию через ассемблерные вставки.
кстати, я тоже пишу небольшой скриптовый движок, собираюсь сделать так чтобы все прототипы функций были одинаковыми. Как вариант: у всех функций два параметра. Первый параметр задаёт количество параметров, а второй это указатель на массив параметров.
во! именно в тачку. то что нужно..
Цитата:
кстати, я тоже пишу небольшой скриптовый движок
ну я вобщем пока не пишу, но очень интересуюсь. Кстати рекомендую посмотреть исходники Lua, там дастаточно хорошая реализация интерпретатора. Ну а по сабжу: если что - только не зажимайте код, ага) ну или где и главное куда копать?

Последний раз редактировалось user_jasser; 31.03.2009 в 02:24.
user_jasser вне форума Ответить с цитированием
Старый 31.03.2009, 03:16   #7
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

А каким образом компилятор добавляет настоящий адрес функции? или он ставит RVA в таблице экспорта, а подгрузчик сам загружает по этом адресу настоящий адрес функции?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 31.03.2009, 08:25   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

у программы есть таблица импорта, обычно находится за секцией с данными. И в ней есть обычная таблица адресов на импортируемые функции. В программе происходит так
Код:
push
push
push
call [address]
address - указывает на элемент в таблице в котором хранится адрес на импортируемую функцию. Загрузчик во пвремя загрузки программы просто заполняет таблицу импорта, нужными адресами.
Код:
push
push
push
call [005А78D6]
.......
005А78D6 : 7A4C7CD0
7A4C7CD0 - адрес на импортируемую функцию

Последний раз редактировалось rpy3uH; 31.03.2009 в 08:28.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выгрузка длл user_jasser Win Api 6 10.03.2009 14:09
ДЛЛ на gcс Иллидан Общие вопросы C/C++ 1 12.10.2008 22:11
Ещё вопрос о длл... Altera Общие вопросы Delphi 6 16.05.2008 06:51
Фрэймы из ДЛЛ SunKnight Общие вопросы Delphi 4 06.01.2008 16:32
Использование длл Anatolij Win Api 1 02.01.2007 19:54