Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.46 MB
Время: 0.008 c
15-1253561708
Anatoly Podgoretsky
2009-09-21 23:35
2009.11.22
Если у кого есть немного свободного времени


2-1254484709
mops
2009-10-02 15:58
2009.11.22
выключение windows


8-1200489157
NaRuTo
2008-01-16 16:12
2009.11.22
Преобразование времени


2-1255147550
NGPOL
2009-10-10 08:05
2009.11.22
Виснет прога во время ExecSQL


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский