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

Вниз

Вызов метода объекта по имени   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
2-1255156605
Aleks
2009-10-10 10:36
2009.11.22
Как программно добавить иконку в ImageList?


3-1230036426
interbase
2008-12-23 15:47
2009.11.22
производная таблица


15-1250101749
alvonen
2009-08-12 22:29
2009.11.22
Кодовые страницы символов и Юникод


2-1255075064
Aleks
2009-10-09 11:57
2009.11.22
Get&Set window focus


2-1254899852
well
2009-10-07 11:17
2009.11.22
ADOQuery + DBGrid Как найти следующую запись в базе?