![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов метода объекта по имени [D5, D7, WinXP]
NiGGa © (2008-11-04 15:46:00)Добрый день.
Собственно простой вопрос: каким образом я могу позвать метод класса имея указатель на экземпляр класса и зная строковое наименование метода. Варианты с 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 полученный под отладчиком. Далее вызов осуществить легко.
Вот проблема в том, что я не хочу статически забивать адрес полученный посредством отладки, а получить его в РанТайм.
Собственно отсуда и вопрос: как получить адрес метода зная его имя.
Всем спасибо
Leonid Troyanovsky (2008-11-05 15:47:00) [1]
> NiGGa (04.11.08 15:46)
> т.к. они бесполезные в своей сущности, или я чего то не
> понял.
В своей сущности они полезны.
> но проблема в том, что в секции uses я не имею (и к сожалению
> не могу) модуля в котором описан класс TMyObj.
И dcu нет? Т.е., это имя указывает пользователь?
Тогда делай экспортируемую регулярную функцию:
function MySomeFunc(ASender: TObject): Integer;
и привязывай ее путем TMethod.Code после GetProcAddress.
--
Regards, LVT.
KSergey (2008-11-05 12:28:00) [2]С использованием интерфейсов это возможно, на сколько я в теме.
Но в рамках "не имею права менять класс" - не подходит. Хотя, если сделать обертку и уже с интерфейсами - то может быть.
NiGGa (2008-11-04 17:43:00) [3][3]
> адрес функции по имени функции ты получить не сможешь...
> будь она хоть трижды виртуальной... компилятор просто не
> фиксирует эту информацию...
Я раньше думал, что позднее связывание осуществляеться по имени метода) Вот видимо оотуда у меня было заблуждение что возможно получить адрес метода по имени. Посмотрел Содержимое записи ВМТ, действительно имени там нет(
NiGGa (2008-11-04 17:40:00) [4][3] Ну это известная шутка ит только для функций Get/Set методов свойств
[4] Да так и есть. И он к сожалению мне не подходит, как я писал в начале поста. Т.к. паблишед методы вещь крайне редкая(по моим наблюдениям). Да и в моем случае, я не имею прва менять класс. Так бы конечно же все было намного легче.
Плохиш (2008-11-04 17:24:00) [5]
> NiGGa (04.11.08 16:52) [2]
> Если же я сделаю SomeFunc виртуальной? Даже тогда я не смогу
> получить ее адрес?
Только, если published.
Palladin (2008-11-04 17:03:00) [6]какая разница... адрес функции по имени функции ты получить не сможешь... будь она хоть трижды виртуальной... компилятор просто не фиксирует эту информацию...
есть, конечно, метод для спец случаев...
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;
так для общего развития... естественно не рекомендован для употребления...
NiGGa (2008-11-04 16:52:00) [7]Если же я сделаю
SomeFuncвиртуальной? Даже тогда я не смогу получить ее адрес?
Palladin (2008-11-04 16:04:00) [8]
> я не хочу статически забивать адрес
а придется