Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Узнать количество параметров процедуры/функции


Автор: lukas 19.11.2007, 20:40
Вообщем задача такая, зная только укатель (Pointer) на функцию/процедуру или метод узнать (хотябы) количество параметров... 

ну что-то типо этого....

Код

// про эту процедуру мы как бы ничего не знаем кроме указателя

procedure Shop(S:String; V:Integer);
begin
....
end;

...
Var
  Count:Integer;
  P:Pointer;
begin
P:=@Shop;
Count:=GetProcParamCount(P); // это выдуманная функция
ShowMessage('Кол-во параметров процедуры : '+Count+' шт.');
end;

Автор: Alexeis 19.11.2007, 21:32
  По моему, такое возможно только для Activex/COM.

Автор: lukas 19.11.2007, 21:35
ну почему же... как работает Pascal Script, безусловно не без этого... что ж... наверно придется кавырять его.... 

Автор: Alexeis 19.11.2007, 21:58
Цитата(lukas @  19.11.2007,  21:35 Найти цитируемый пост)
ну почему же... как работает Pascal Script

  Так он же в себе сорцы хранит, а экзешник нет. Описание параметров есть в тлбшках, сборках дотнета.

Автор: lukas 19.11.2007, 22:41
так а по подробнее об этом...  smile ну или ссылку на документацию...

Добавлено через 6 минут и 37 секунд
к тому же я не представляю как хранить функции и процедуры с разными типами параметров и с разным их количеством... чтобы их еще при этом можно было вызывать...

Автор: EvilsInterrupt 20.11.2007, 10:09
lukas, 
Все куда проще ;)
Когда ты пишешь код, то уже на стадии компиляции известно, сколько будет аргументов в конкретном месте кода!

Даже при этом:
if a= b then
// вызовем Функ1 с двумя аргументами
else вызовем Функ1 с одним аргументом

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

Но когда дело касается классов и виртуальных, динамических методов. А также автоматных интерфейсов в технологии COM, тут немного по сложнее. Тут вычисляется адрес нужного метода и происходит вызов.

Вывод, кол-во параметров можно узнать, только если изучить схему вызова, т.е. как все дело передается в стек. За одно будешь знать соглашение о вызове. ;)

ЗЫ:
ИМХО, я могу ошибаться, особо наверу не принимайте, а лучше перепроверьте

Автор: lukas 20.11.2007, 17:15
ну вообщем... как в Паскаль скрипте мы добавляем функции и процедуры... что то типа этого...


Код

....
AddFunction('Function GetSome(S:String; I:Integer):Real;', @GetSome);



EvilsInterrupt, 

так я понимаю что кол-во параметров вычисляется компилятором... но как обратиться к функции (допустим)... 

нужно придумать какой-то универсальный процедурный тип... только как?... хз.

Автор: Alexeis 20.11.2007, 17:21
lukas, сильно смахивает на паттерн "стратегия". Мож не мучиться и сделать как полагается при помощи ООП.

Автор: lukas 20.11.2007, 17:28
Да и в правду... наверно игра не стоит свеч... если найду способ отпишусь... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)