Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.04 c