Главная страница
    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.47 MB
Время: 0.006 c
15-1253871319
TUser
2009-09-25 13:35
2009.11.22
Как называется фильм


15-1251547820
Kerk
2009-08-29 16:10
2009.11.22
Захват потокового видео из браузера


4-1201527066
Вредитель
2008-01-28 16:31
2009.11.22
DLL и прорамма


2-1254482329
Aleks
2009-10-02 15:18
2009.11.22
Как программно нажать кнопку на форме?


10-1159674288
arty
2006-10-01 07:44
2009.11.22
Delphi+MathCad





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