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

Вниз

Как получить указатель на public свойства/методы   Найти похожие ветки 

 
HydraMarat   (2004-03-24 17:25) [0]

Всем привет! В TObject определены MethodAddress и FieldAddress, но работают они только с published свойствами/методами (Америку открыл, да?). А можно ли "выцепить" public? Есть для этого какие-нибудь алгоритмы? Однажды, просмотр CPUView показал, что в коде вроде хранятся имена этих методов. Значит можно найти! Кто-нибудь знает как? А если никак, то хоть развейте мои надежды.

Спасибо.


 
Digitman ©   (2004-03-24 17:29) [1]


> Значит можно найти!


нельзя.
то, что ты видишь, берется отладчиком из DCU + PAS ... никакого отношения к обычному ран-тайм это не имеет


 
Тимохов ©   (2004-03-24 17:30) [2]

по имени public метода определить его адрес незя.


 
Тимохов ©   (2004-03-24 17:30) [3]


> HydraMarat   (24.03.04 17:25)  

если очень надо сам храни пару (имя, адрес).


 
HydraMarat   (2004-03-24 17:42) [4]

Гм... так вообще-то имя метода я видел в правом нижнем окошке CPU View. Там вроде отладчик ничего не подставляет. Но похоже вы все-таки правы. Блин, ну как обидно, а...


 
HydraMarat   (2004-03-24 17:44) [5]

Тьфу, в левом нижнем...


 
Skier ©   (2004-03-24 17:45) [6]

А зачем сие ?


 
HydraMarat   (2004-03-24 17:48) [7]

Ну надо вот вызвать метод объекта по имени. Класс заранее неизвестен, а вот имечко известно.

Кстати вопрос:
А как же тогда методы из любой секции предоставляются в виде интерфейсов (вернее реализацию можно запихнуть хоть в private)? Такой метод разве не по имени искать будут?


 
Defunct ©   (2004-03-24 17:51) [8]

В чем проблема?

@MyPublicMethod

(Америку открыл, да?) (C)


 
Тимохов ©   (2004-03-24 17:52) [9]


> HydraMarat   (24.03.04 17:48) [7]

не силен в этом, но вроде там для этого специально dispinerface есть, и вроде как метод invoke реалзовывать надо.
Простите, знающие, если сказал лажу.
Просто привел это для того, чтобы показать, что в случае интерфейсов не используется имя метода, предоставляемое delphi, а делается это спец методами.


 
Skier ©   (2004-03-24 17:55) [10]

>HydraMarat   (24.03.04 17:48) [7]

> Класс заранее неизвестен, а вот имечко известно.

Полиморфизм не выручит ?


> Такой метод разве не по имени искать будут?

По имени...см. TAutoObject.GetIDsOfNames и TAutoObject.Invoke


 
HydraMarat   (2004-03-24 17:55) [11]

Defunct.
И где я это напишу? Я знаю строку, строковую переменную с именем метода и цифирку - указатель на класс. Как я это в коде изображу?

Тимохов
А говорят можно жить и без dispinterface"ов! Они вроде как только для ActiveX. Может щас кто точно знающий напишет? Ээх... надежда еще живет :)


 
Тимохов ©   (2004-03-24 17:57) [12]


> Может щас кто точно знающий напишет?

знающий может вам про интерфейсы написать.
про то как вообще доступиться к методу по имени вам ни один знающий не ответи ибо нельзя этого.


 
HydraMarat   (2004-03-24 17:57) [13]

Skier.
А вот этот GetIDsOfNames кто реализовывает? Компилятор сам это формирует что-ли? Если, например, я просто от TInterfacedObject"а унаследуюсь?


 
Vuk ©   (2004-03-24 17:58) [14]

to HydraMarat   (24.03.04 17:55) [11]:
>Может щас кто точно знающий напишет?
Уже написали. Самым первым ответом.

>Ээх... надежда еще живет :)
Хороните.


 
HydraMarat   (2004-03-24 18:01) [15]

Тимохов.
Собственно, я про интерфейсы и имел ввиду. Вот стрём... А че им жалко имена выложить? Вроде в C# такая фишка есть (правда не выяснял точно), эээ... RTTI вроде называется.


 
Defunct ©   (2004-03-24 18:04) [16]

HydraMarat   (24.03.04 17:55) [11]
И где я это напишу? Я знаю строку, строковую переменную с именем метода и цифирку - указатель на класс. Как я это в коде изображу?


Где-где в методе, который будет заниматься экспортом имен или запуском методов по имени:

...
Private
 FParams :  TExecuteParamRec;
Public
 Procedure Zz;
 Procedure Zzz;
 Procedure Zzzz;

Published
 Procedure ExecuteMethodBy(Name:ShortString);
 Property  Params:TExecuteParamRec Write FParams
 Function  GetMethodAddressBy(Name:ShortString):Pointer;
..

Procedure TSomething.ExecuteMethodBy;
Begin
 If Name = "Zzzz" Then Zzzz(..параметры из Params..) Else
 If Name = "Zzz"  Then Zzz(..параметры из Params..) Else
 ...
End;

Function TSomething.GetMethodAddressBy;
Begin
 If Name = "Zzzz" Then Result := @Zzzz Else
 If Name = "Zzz"  Then Result := @Zzz Else
 ...
End;


 
Skier ©   (2004-03-24 18:04) [17]


> Вроде в C# такая фишка есть (правда не выяснял точно)

Есть. Рефлексия типов называется.
Переходи на C# :)


 
Тимохов ©   (2004-03-24 18:06) [18]


> Skier ©   (24.03.04 18:04) [17]

"умри, тоска" :)))

тут бывает говорят "вот потому то я и выбрал сишарп... бла бла бла"

Не будем людей от дельфи отговаривать! Дельфи - это хорошо.


 
HydraMarat   (2004-03-25 08:56) [19]

Defunct
Сие будет мягко скажем медленно! Да и класс то неизвестен! Как я его "приведу"? Вообщем, облом с этим... А жаль. :)

Skier
:) Угу, годика через два.

Тимохов
Да не отговорят! Уж слишком я уважаю "begin end" против "{ }". :)


 
KSergey ©   (2004-03-25 09:10) [20]

>  [15] HydraMarat   (24.03.04 18:01)
> А че им жалко имена выложить? Вроде в C# такая фишка есть
> (правда не выяснял точно), эээ... RTTI вроде называется.

А в Delphi - это Published методы. Как раз это RTTI и называется. Чем не нравится-то? Используй наздоровье!


 
Digitman ©   (2004-03-25 09:40) [21]


> HydraMarat  


нормальных выходов у тебя, как уже сказали выше, два : перенести требуемые идентификаторы в паблишед-секцию и пользовать RTTI либо реализовать в своих классах IDispath .. последнее, кстати, вовсе не означает какие-то "завязки" с ActiveX и OLE - любой твой класс, для чего бы он не был предназначен, может реализовать этот интерфейс для твоих внутренних нужд, ничем это не чревато и никаких из ряда вон выходящих доп.ресурсов не потребует, если, разумеется, ты будешь реализовывать этот интерфейс "ручками"


 
Erik ©   (2004-03-25 09:54) [22]

Вобщето если быть обсолютно точным это можно сделать, но непонимаю зачем так извращатся. Наверника неправильная трактовка задачи! Есть такая вещи как map фаил, его можно подключить к программе. После ищи себе на здорове, но это будет небыстро. Для облегцения твоей задаци есть есть набор класов в JCL.
TJclModuleInfoList, TJclMapParser, TJclMapScanner, TJclBinDebugScanner и пр....
Но думаю, что ты неправ в главном.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
1-1082452929
Tornado
2004-04-20 13:22
2004.04.11
Помогите побороть TListView


8-1076342936
Сережа
2004-02-09 19:08
2004.04.11
Рисование


3-1078979596
Алексей Петухов
2004-03-11 07:33
2004.04.11
Ограниченный размер поля Image


7-1078743352
-=наблюдатель=-
2004-03-08 13:55
2004.04.11
Lock


14-1082105036
Style
2004-04-16 12:43
2004.04.11
Верите ли вы в НЛО, и в то что нас часто посещают инопланетяне?