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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2009, 15:19   #1
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию Вызов произвольной функции из DLL

Подскажите пожалуйста, как используя ассемблер(без него никак) интегрированный в Delphi вызвать произвольную функцию с параметрами из любой ДЛЛки.
Например, есть
Код:
function CallSomeFunc(dllfile:string;name:string;params:array of const):Какой-то тип;
которая вызывает функцию и возвращает результат.
Роман Радер вне форума Ответить с цитированием
Старый 18.02.2009, 16:10   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

если функция stdcall, то так

Код:
push params
push name
push dllfile
call CallSomeFunc
mov [res], eax
rpy3uH вне форума Ответить с цитированием
Старый 18.02.2009, 16:18   #3
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

нет, немного не так. нужно загрузить библиотеку dllfile, поместить в стек параметры из массива и вызвать оттуда функцию name с теми параметрами.
CallSomeFunc - обертка этого вызова.
Код:
function CallSomeFunc(dllfile:string;name:string;params:array of const):integer;
asm
код вызова
end;
можно и изменить описание функции. "подогнать" под реализацию.
просто учитывая, что параметр каждый своего типа, я не знаю как помещать в стек их. вызвать из длл впринципе не проблема. вот поместить неопределенное кол-во параметров - незнаю как.
и вызвать функцию не по имени - а по содержанию в переменной.

Последний раз редактировалось Роман Радер; 18.02.2009 в 16:24.
Роман Радер вне форума Ответить с цитированием
Старый 18.02.2009, 16:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Роман Радер
Ну а Грузин тебе что сказал? Как раз то что сказал только что ты.

Цитата:
как используя ассемблер(без него никак)
Кстати почему?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.02.2009, 16:35   #5
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Stilet, а вы знаете как иначе?

Мне не CallSomeFunc ассемблером вызвать надо!
Ладно объясню по-другому.
Есть dll. Программе задается число N - количество параметров.
N типов - типы параметров.
N значений - сами параметры.
Также, задается путь и имя к DLL и имя функции. Необходимо вызвать функцию.
Буду очень признателен.
Роман Радер вне форума Ответить с цитированием
Старый 18.02.2009, 17:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

DLL ты пишеш?
Примени массив Variant или безразмерный массив

Всетки я не пойму почему именно ассемблер.
Можно просто выделить память напихать туда нужной информации, а в ДЛЛ передавать указатель на эту память и кол-во параметров.

Вот что я имею ввиду:

Проект:
Код:
    function a(aga:array of integer):integer; external 'project2.dll';
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
caption:=inttostr(a([1,2,3]));
end;
ДЛЛ
Код:
uses
  SysUtils,
  Classes;

{$R *.res}
    function a(aga:array of integer):integer;
    var i:integer;
    begin
      for i:=low(aga) to high(aga) do result:=result+aga[i];
    end;
    exports a;
begin
end.
I'm learning to live...

Последний раз редактировалось Stilet; 18.02.2009 в 17:07.
Stilet вне форума Ответить с цитированием
Старый 18.02.2009, 18:01   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
Ладно объясню по-другому.
Есть dll. Программе задается число N - количество параметров.
N типов - типы параметров.
N значений - сами параметры.
Также, задается путь и имя к DLL и имя функции. Необходимо вызвать функцию.
во-первых, универсальную сделать не получится
во-вторых, в ассемблере нет типов
в-третьх, сколько параметров столько раз надо сделать push.
В основном передают указатели, за исключением числовых типов и символьных.

Последний раз редактировалось rpy3uH; 18.02.2009 в 18:04.
rpy3uH вне форума Ответить с цитированием
Старый 18.02.2009, 18:44   #8
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Stilet, dll пишу не я. например, это dll из /system32/ apiшная какая-то.
rpy3uH, а как тогда работает компилятор Делфи? вот мы пишем статическую привязку к функции в ДЛЛ. как компилятор это обрабатывает? парсит код, определяет параметры и как-то вызывает.
да и не только делфи, любой язык который позволяет работать с DLL

Последний раз редактировалось Роман Радер; 18.02.2009 в 18:46.
Роман Радер вне форума Ответить с цитированием
Старый 18.02.2009, 19:31   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
rpy3uH, а как тогда работает компилятор Делфи? вот мы пишем статическую привязку к функции в ДЛЛ. как компилятор это обрабатывает? парсит код, определяет параметры и как-то вызывает.
да и не только делфи, любой язык который позволяет работать с DLL
компилятор знает заранее что, как и зачем и сразу генерит нужный код. А тебе надо на лету всё сделать и ещё и вызвать.
rpy3uH вне форума Ответить с цитированием
Старый 18.02.2009, 19:44   #10
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

мдя... ясно. может, генерировать код, ассемблером компилировать, засунуть в память и запустить? О_о
кстати, компилятор ассемблера бесплатный?
Роман Радер вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и вызов библиотеки dll DM_bite Помощь студентам 3 15.06.2010 12:47
Вызов функции MarSeON PHP 2 01.08.2008 20:22
вызов из dll не ShowModal. Roof Общие вопросы Delphi 7 25.07.2008 15:22
Автоматический вызов функции класса Flaton Общие вопросы C/C++ 4 19.10.2007 17:56
Вызов функции по таймеру Lexicss Общие вопросы Delphi 4 30.05.2007 22:47