Форум: "Основная";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
Вниз
Вызов метода объекта по имени Найти похожие ветки
← →
NiGGa (2008-11-04 15:46) [0]Добрый день.
Собственно простой вопрос: каким образом я могу позвать метод класса имея указатель на экземпляр класса и зная строковое наименование метода. Варианты с MethodAddress не предлагать, т.к. они бесполезные в своей сущности, или я чего то не понял.
Кому формулировка вопроса не ясна, формулирую на примере.
У меня есть в наличии экземпляр MyObj типа TObject. На самом деле я знаю что это экземпляр классаTMyObj = class(TObject)
public
function SomeFunc: integer;
end;
Я бы конечно же мог решить проблему посредством приведения аляTMyObj(MyObj).SomeFunc
или черезas
, но проблема в том, что в секцииuses
я не имею (и к сожалению не могу) модуля в котором описан класс TMyObj. В принципе я могу завести переменнуюMyObjMethod: TMethod;
тогдаMyObjMethod.Data := Pointer(MyObj);
а в MyObjMethod.Code засунуть адресс функции SomeFunc полученный под отладчиком. Далее вызов осуществить легко.
Вот проблема в том, что я не хочу статически забивать адрес полученный посредством отладки, а получить его в РанТайм.
Собственно отсуда и вопрос: как получить адрес метода зная его имя.
Всем спасибо
← →
Palladin © (2008-11-04 16:04) [1]
> я не хочу статически забивать адрес
а придется
← →
NiGGa (2008-11-04 16:52) [2]Если же я сделаю
SomeFunc
виртуальной? Даже тогда я не смогу получить ее адрес?
← →
Palladin © (2008-11-04 17:03) [3]какая разница... адрес функции по имени функции ты получить не сможешь... будь она хоть трижды виртуальной... компилятор просто не фиксирует эту информацию...
есть, конечно, метод для спец случаев...Type
{$TYPEINFO ON}
TMyClass=Class
Private
Function GetValue:Integer;
Published
Property Value:Integer Read GetValue;
End;
{$TYPEINFO OFF}
Function TMyClass.GetValue;Begin Result:=5;End;
procedure TForm1.Button2Click(Sender: TObject);
Var
p:PPropInfo;
begin
ShowMessage(IntToStr(Integer(Pointer(@TMyClass.GetValue))));
p:=GetPropInfo(TMyClass,"value");
ShowMessage(IntToStr(Integer(p.GetProc)));
End;
так для общего развития... естественно не рекомендован для употребления...
← →
Плохиш © (2008-11-04 17:24) [4]
> NiGGa (04.11.08 16:52) [2]
> Если же я сделаю SomeFunc виртуальной? Даже тогда я не смогу
> получить ее адрес?
Только, если published.
← →
NiGGa (2008-11-04 17:40) [5][3] Ну это известная шутка ит только для функций Get/Set методов свойств
[4] Да так и есть. И он к сожалению мне не подходит, как я писал в начале поста. Т.к. паблишед методы вещь крайне редкая(по моим наблюдениям). Да и в моем случае, я не имею прва менять класс. Так бы конечно же все было намного легче.
← →
NiGGa (2008-11-04 17:43) [6][3]
> адрес функции по имени функции ты получить не сможешь...
> будь она хоть трижды виртуальной... компилятор просто не
> фиксирует эту информацию...
Я раньше думал, что позднее связывание осуществляеться по имени метода) Вот видимо оотуда у меня было заблуждение что возможно получить адрес метода по имени. Посмотрел Содержимое записи ВМТ, действительно имени там нет(
← →
KSergey © (2008-11-05 12:28) [7]С использованием интерфейсов это возможно, на сколько я в теме.
Но в рамках "не имею права менять класс" - не подходит. Хотя, если сделать обертку и уже с интерфейсами - то может быть.
← →
Leonid Troyanovsky © (2008-11-05 15:47) [8]
> NiGGa (04.11.08 15:46)
> т.к. они бесполезные в своей сущности, или я чего то не
> понял.
В своей сущности они полезны.
> но проблема в том, что в секции uses я не имею (и к сожалению
> не могу) модуля в котором описан класс TMyObj.
И dcu нет? Т.е., это имя указывает пользователь?
Тогда делай экспортируемую регулярную функцию:
function MySomeFunc(ASender: TObject): Integer;
и привязывай ее путем TMethod.Code после GetProcAddress.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c