Запуск метода зная его адрес и кол-во пар-ов
@loop:
mov eax,PFP[tmp2]
push eax
dec tmp2
cmp tmp2,-1
je @ProcCall
jmp @loop
@ProcCall:
call p
end;
В масиве PFP хранятся параметры(Cardinal), в tmp2 количество параметров, а в p адрес на метод.
Вот пример: У нас есть функция с адресом P и прототипом:
function (A: integer; B: integer): integer; stdcall;
Объявим тип
TMyFunc = function (A, B: integer): integer; stdcall;
var
P: pointer;
F: TMyFunc absolute P;
begin
Res:=F(ParamA, ParamB)
end;
А процедурные типы в Делфи разве отменили?
А почему сразу отменили? Я чо дурак что ли, их не использовать если бы все было так просто. А умня всё сложнее. Я незаню количество параметров на этапе компиляции. Их и сами параметры я узнаю только во время выполнения самой программы => я не могу иметь какойто один прототип. Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.
А почему сразу отменили? Я чо дурак что ли, их не использовать если бы все было так просто. А умня всё сложнее. Я незаню количество параметров на этапе компиляции. Их и сами параметры я узнаю только во время выполнения самой программы => я не могу иметь какойто один прототип. Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.
А собственно массив передавать? Или я что-то не понял?
Я незаню количество параметров на этапе компиляции. Их и сами параметры я узнаю только во время выполнения самой программы => я не могу иметь какойто один прототип. Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.
Ты хочешь написать программу, которая бы могла взывать любую функцию в рантайме?
Интересно, зачем такая универсальность? Просто проще будет генерить объектный код по прототипу вызываемой функции и сразу его выполнять - а тут без асма не уехать.
Народ. Помогите пожайлуста. Требуется запустить метод заня его адрес, количество параметров и сами параметры, хранящиеся в масиве. Я писал так но не помогает (асемблерщик из меня плохой):
@loop:
mov eax,PFP[tmp2]
push eax
dec tmp2
cmp tmp2,-1
je @ProcCall
jmp @loop
@ProcCall:
call p
end;
В масиве PFP хранятся параметры(Cardinal), в tmp2 количество параметров, а в p адрес на метод.
По умолчанию в дельфи передача параметров - register. А у тебя передача stdcall.
Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.
А как насчет
begin
// ... //
end;
begin
MyFunc([32, 's', 'ppp', Pi]);
end.
По умолчанию в дельфи передача параметров - register. А у тебя передача stdcall.
Я знаю, поэтому заполняю стек с конца.
А как насчет
begin
// ... //
end;
begin
MyFunc([32, 's', 'ppp', Pi]);
end.
Можно попробовать.