Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Как получить указатель на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.037 c
3-1081847949
Rych
2004-04-13 13:19
2004.04.11
Как проверить присутствует-ли занчение в TDataSet ?


1-1082210213
alsov1234
2004-04-17 17:56
2004.04.11
Медленный скролинг в гриде


8-1076566297
disciple
2004-02-12 09:11
2004.04.11
Компоненты TrackBar и MediaPlayer


14-1082377252
Родион
2004-04-19 16:20
2004.04.11
Работа с файлами


1-1079840364
Alibaba
2004-03-21 06:39
2004.04.11
Назначаем процедуру





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