Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.22;
Скачать: CL | DM;

Вниз

Как выполнить функцию с заранее неизвестным именем?   Найти похожие ветки 

 
nikolo ©   (2002-08-09 13:03) [0]

Проблема в следующем. У меня например есть БД имен функций, все они возвращают Integer. Могу ли я как-то динамически выполнять эти функции, например что-то типа такого:

qry.SQL.Text := "Select FuncName From XXX Where Id=5";
qry.Open;

i := ??? // как здесь объявить FuncName?


Помогите, очень нужно!


 
Skier ©   (2002-08-09 13:09) [1]

>nikolo
Если у тебя у всех функций одинаковые параметры, то можно
положить их в DLL, а дальше объявить тип функции
TYourFunction = function(...Params...) : Integer; stdcall;

и получать их адрес из Dll по имени
функции через GetProcAddress(...)


 
PVOzerski ©   (2002-08-09 13:57) [2]

Можно даже в DLL не выкладывать: exports допустим и в EXE. Stdcall тоже ни к чему: мы же эти функции не готовим к импорту в приложения, не поддерживающие дельфийскую register calling convention. Так что будем импортировать из самих себя :^).


 
nikolo ©   (2002-08-09 13:59) [3]

Ок, так работает, а если параметры не одинаковые, можно ли формировать их список для каждой функции по-отдельности на лету?


 
Skier ©   (2002-08-09 14:00) [4]

>PVOzerski


> Stdcall тоже ни к чему: мы же эти функции не готовим к импорту
> в приложения


Ну...совсем закритиковал...я просто раздавлен :)))


 
Opuhshii ©   (2002-08-09 14:22) [5]

2nikolo © (09.08.02 13:59)
прочти разделы "Memory management" и "Procedures and functions" из Object Pascal Reference,...
а вообще это называется интерпретатор,...


 
PVOzerski ©   (2002-08-09 14:26) [6]

>Ок, так работает, а если параметры не одинаковые, можно ли
>формировать их список для каждой функции по-отдельности на лету?

IMHO, оптимальное решение: передавать параметры как array of const. Иначе функции придется вызывать из ассемблерных вставок, вручную манипулируя регистрами и стэком, - стОит ли игра свеч?


 
Skier ©   (2002-08-09 14:35) [7]

>nikolo
Можно так :
-Создать класс
-опуликовать там все методы, которые будут использоваться
-а дальше RTTI и вперёд...

(Хотя твоя "конечная" цель неизвестна... )


 
Opuhshii ©   (2002-08-09 14:42) [8]

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;



Страницы: 1 вся ветка

Текущий архив: 2002.08.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
1-71106
croupeir
2002-08-12 20:08
2002.08.22
как всавить код во вновь создаваемый объект


3-71046
RUS1
2002-08-01 14:35
2002.08.22
Подскажите утилитку для администрации IB 6 (типа quickDesk)


4-71443
dolbik2001
2002-06-20 19:41
2002.08.22
работа с чужими окнами


1-71077
Елена
2002-08-12 06:38
2002.08.22
Цвет фона для OleContainer


3-71058
RUS1
2002-08-01 15:38
2002.08.22
Господа а какие у вас есть мнения по данному вопросу...?