![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выполнить функцию с заранее неизвестным именем? [D5, NT4, Win2k]
nikolo © (2002-08-09 13:03:00)Проблема в следующем. У меня например есть БД имен функций, все они возвращают Integer. Могу ли я как-то динамически выполнять эти функции, например что-то типа такого:
qry.SQL.Text := "Select FuncName From XXX Where Id=5";
qry.Open;
i := ??? // как здесь объявить FuncName?
Помогите, очень нужно!
Opuhshii (2002-08-09 14:42:00) [1]EBP-вершина стека, размер параметров см в
"Memory management"
procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
Proc:Pointer;
begin
S:="Hello world";
Proc:=@Showmessage;
asm
mov EAX,S
CALL Proc
end;
end;
Skier (2002-08-09 14:35:00) [2]>nikolo
Можно так :
-Создать класс
-опуликовать там все методы, которые будут использоваться
-а дальше RTTI и вперёд...
(Хотя твоя "конечная" цель неизвестна... )
PVOzerski (2002-08-09 14:26:00) [3]>Ок, так работает, а если параметры не одинаковые, можно ли
>формировать их список для каждой функции по-отдельности на лету?
IMHO, оптимальное решение: передавать параметры как array of const. Иначе функции придется вызывать из ассемблерных вставок, вручную манипулируя регистрами и стэком, - стОит ли игра свеч?
Opuhshii (2002-08-09 14:22:00) [4]2nikolo © (09.08.02 13:59)
прочти разделы "Memory management" и "Procedures and functions" из Object Pascal Reference,...
а вообще это называется интерпретатор,...
Skier (2002-08-09 14:00:00) [5]>PVOzerski
> Stdcall тоже ни к чему: мы же эти функции не готовим к импорту
> в приложения
Ну...совсем закритиковал...я просто раздавлен :)))
nikolo (2002-08-09 13:59:00) [6]Ок, так работает, а если параметры не одинаковые, можно ли формировать их список для каждой функции по-отдельности на лету?
PVOzerski (2002-08-09 13:57:00) [7]Можно даже в DLL не выкладывать: exports допустим и в EXE. Stdcall тоже ни к чему: мы же эти функции не готовим к импорту в приложения, не поддерживающие дельфийскую register calling convention. Так что будем импортировать из самих себя :^).
Skier (2002-08-09 13:09:00) [8]>nikolo
Если у тебя у всех функций одинаковые параметры, то можно
положить их в DLL, а дальше объявить тип функции
TYourFunction = function(...Params...) : Integer; stdcall;
и получать их адрес из Dll по имени
функции через GetProcAddress(...)