Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запуск метода зная его адрес и кол-во пар-ов

7.9K
14 марта 2006 года
***Zebr@XXL***
47 / / 18.08.2005
Народ. Помогите пожайлуста. Требуется запустить метод заня его адрес, количество параметров и сами параметры, хранящиеся в масиве. Я писал так но не помогает (асемблерщик из меня плохой):
Код:
asm
        @loop:
          mov eax,PFP[tmp2]
          push eax
          dec tmp2
          cmp tmp2,-1
          je @ProcCall
          jmp @loop
        @ProcCall:
          call p
      end;

В масиве PFP хранятся параметры(Cardinal), в tmp2 количество параметров, а в p адрес на метод.
5
15 марта 2006 года
hardcase
4.5K / / 09.08.2005
А процедурные типы в Делфи разве отменили?

Вот пример: У нас есть функция с адресом P и прототипом:
function (A: integer; B: integer): integer; stdcall;

Объявим тип
 
Код:
type
  TMyFunc = function (A, B: integer): integer; stdcall;

var
 P: pointer;
 F: TMyFunc absolute P;
begin
 Res:=F(ParamA, ParamB)
end;
7.9K
16 марта 2006 года
***Zebr@XXL***
47 / / 18.08.2005
Цитата:
Originally posted by hardcase
А процедурные типы в Делфи разве отменили?


А почему сразу отменили? Я чо дурак что ли, их не использовать если бы все было так просто. А умня всё сложнее. Я незаню количество параметров на этапе компиляции. Их и сами параметры я узнаю только во время выполнения самой программы => я не могу иметь какойто один прототип. Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.

16K
16 марта 2006 года
ENIAC
3 / / 21.02.2006
Цитата:
Originally posted by ***Zebr@XXL***
А почему сразу отменили? Я чо дурак что ли, их не использовать если бы все было так просто. А умня всё сложнее. Я незаню количество параметров на этапе компиляции. Их и сами параметры я узнаю только во время выполнения самой программы => я не могу иметь какойто один прототип. Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.



А собственно массив передавать? Или я что-то не понял?

5
16 марта 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by ***Zebr@XXL***
Я незаню количество параметров на этапе компиляции. Их и сами параметры я узнаю только во время выполнения самой программы => я не могу иметь какойто один прототип. Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.


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

303
17 марта 2006 года
makbeth
1.0K / / 25.11.2004
Цитата:
Originally posted by ***Zebr@XXL***
Народ. Помогите пожайлуста. Требуется запустить метод заня его адрес, количество параметров и сами параметры, хранящиеся в масиве. Я писал так но не помогает (асемблерщик из меня плохой):
Код:
asm
        @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.

10
17 марта 2006 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by ***Zebr@XXL***
Количество параметров может быть и один, и два, да хоть милион если на них хватит памяти и нервов записывать.


А как насчет

 
Код:
procedure MyFunc(const Args: array of const);
begin
  // ... //
end;

begin
  MyFunc([32, 's', 'ppp', Pi]);
end.
7.9K
18 марта 2006 года
***Zebr@XXL***
47 / / 18.08.2005
Цитата:
Originally posted by makbeth
По умолчанию в дельфи передача параметров - register. А у тебя передача stdcall.



Я знаю, поэтому заполняю стек с конца.

7.9K
18 марта 2006 года
***Zebr@XXL***
47 / / 18.08.2005
Цитата:
Originally posted by Freeman
А как насчет
 
Код:
procedure MyFunc(const Args: array of const);
begin
  // ... //
end;

begin
  MyFunc([32, 's', 'ppp', Pi]);
end.



Можно попробовать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог