Форум: "Основная";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизВызов функции по имени в run-time Найти похожие ветки
← →
d_oleg © (2007-05-28 17:36) [0]Возникла необходимость вызвать метод объекта по имени да к тому же передать параметры. При этом на момент компиляции неизвестен сам формат метода, то есть нельзя написать банально:
type
TMyMethod = procedure(AParam: Integer) of Object;
и потом это тип использовать. Нашел в недрах OleCtrls процедурину CallEventMethod - в-принципе, то что надо, метод вызывается, но вот с параметрами - беда. Никто не сталкивался с подобной задачей?
← →
MBo © (2007-05-28 17:45) [1]цель какая?
← →
d_oleg © (2007-05-28 17:59) [2]
> цель какая?
Цель - вызывать функцию по имени, передать ей параметры.
← →
MBo © (2007-05-28 18:05) [3]Для обычной функции - DLL можно использовать
Для методов объектов - сделать их Published и использовать RTTI
← →
Loginov Dmitry © (2007-05-28 18:28) [4]> Для обычной функции - DLL можно использовать
Вместо использования DLL можно записать адреса всех статических процедур в списке TList.
← →
Leonid Troyanovsky © (2007-05-28 18:50) [5]
> MBo © (28.05.07 18:05) [3]
> Для обычной функции - DLL можно использовать
Можно и сам exe.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-05-28 18:58) [6]
> d_oleg © (28.05.07 17:59) [2]
> Цель - вызывать функцию по имени, передать ей параметры.
http://rsdn.ru/Forum/Message.aspx?mid=476748&only=1
--
Regards, LVT.
← →
d_oleg © (2007-05-28 23:36) [7]
> Для методов объектов - сделать их Published и использовать
> RTTI
да, в этом направлении и смотрю, но в RTTI - работа со свойствами, не с методами. Адрес метода-то я получу, а вот как выполнить его с параметрами?
Leonid Troyanovsky нет, не то. Я же говорю (в самом первом посте), что не известно заранее формат вызова метода, поэтому такое не подходитvar
CommandProc: function: Integer of object;
← →
d_oleg © (2007-05-28 23:43) [8]Поробую пояснить немного общую задачу: COM-приложение клиент/сервер, бизнес-логика находится на сервере, описание форм находится на сервере, клиент лишь получает текстовое описание формы, строит ее и отображает/изменяет данные посредством data snap. Соответственно, требуется для простейших операций на стороне клиента иметь возможность вызова некоторых методов объектов формы. Некоторые методы можно, конечно, заменить работой со свойствами через RTTI (и так все пока и работает), но все же вызов метода необходим...
"Чистый" (без параметров) вызов метода сейчас реализован по аналогии с CallEventMethod из OleCtrls.
← →
Плохиш © (2007-05-28 23:59) [9]
> d_oleg © (28.05.07 23:43) [8]
> Поробую пояснить немного общую задачу: COM-приложение
Может стоит для начала теорию изучить, вместо изобретения велосипеда с квадратными колёсами. Начать можно с этой книги http:// www.books.ru/shop/search?search_type=+&query=5-94157-142-9
← →
d_oleg © (2007-05-29 08:52) [10]> Плохиш, теория вполне изучена, спасибо.
← →
Сергей М. © (2007-05-29 09:08) [11]
> d_oleg
см. все о диспинтерфейсах (IDispatch)
← →
VPBar (2007-05-29 09:48) [12]Мне в свое время на такой вопрос ответили "Интерпритатор пишешь?".
Если метод нужно описать и вызвать в рантайме, то см.
DelphiWebScript http://www.dwscript.com
Innerfuse Pascal Script III (IFPS3) http://www.carlo-kok.com/
Можно воспользоваться MSScriptControl
Все эти способы позволяют вызвать функции из длл и Dispatch методы с произвольными параметрами описываемыми в рантайме.
Чтобы вызывать published методы любого класса надо завернуть его в прокси. Типа такого TVCLProxy и TVCLScriptControl, поищи в инете по этим словам.
← →
d_oleg © (2007-05-31 11:29) [13]ObjAuto.pas, функции GetMethodInfo и ObjectInvoke отлично решают проблему.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c