Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
7-71397
qwen
2002-06-08 00:03
2002.08.22
Как полчить спсиок всех дисков?


3-70962
Enig
2002-08-01 08:15
2002.08.22
Экспорт


3-70994
S@shka
2002-07-31 12:53
2002.08.22
Чем отличается Commit от CommitRetaining


14-71357
AlexRya
2002-07-25 00:47
2002.08.22
Так себе вопросик


3-71028
lejik
2002-07-25 13:05
2002.08.22
Как отучить от автодобавления записи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский