![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение адреса метода изнутри
Alex_Ne © (2007-11-12 15:26:00)Добрый день! Каждый метод имеет ссылку на собственный обект (переменная Self). А что делать, если код метода должен получить адрес или имя самого метода? Можно ли его извлечь
откуда-либо.
Вбивать для каждого метода код типа
procedureDestСomp.AnyoneMethod(Sender: TObject);
varCode : pointer;
begin
Code := MethodAddress('AnyoneMethod');
или
Code := @AnyoneMethod;
............................................
end;
как-то представляется не очень красивым и правильным. Хотелось бы иметь универсальный подход. Т.е. последовательность операторов, не требующую изменений и позволяющую внутри метода получить его адрес или имя.
Но облазив Help не нашел ничего подходящего. Может кто сталкивался с подобной проблемой?
Заранее спасибо.
Сергей М. (2007-11-14 11:32:00) [1]Аминь.
Alex_Ne (2007-11-14 11:32:00) [2].........
> Но перед этим затачиваются голова + руки.
Воистину универсальная рекомендация. Продолжать дискуссию не вижу смысла, ибо все остальное частноси, не заслуживающие внимания.
Сергей М. (2007-11-14 11:19:00) [3]
> А если их (арр-серверов) сдесяток на одном компе и состав
> может
> меняться, в зависимости от того, какое оборудование куда
> подключается?
Да на здоровье. Хоть миллион)
Тебя же не смущает наличие в системе огромной кучи dll/exe с фабриками классов ?)
> Что, каждый раз BSS затачивать?
BSS затачивается один раз. Но перед этим затачиваются голова + руки.
Alex_Ne (2007-11-14 11:09:00) [4]
> BSS будет создавать объект твоего app-сервера "на лету",
> безо всяких привязок к реестру
А если их (арр-серверов) сдесяток на одном компе и состав может
меняться, в зависимости от того, какое оборудование куда
подключается? Что, каждый раз BSS затачивать?
Сергей М. (2007-11-14 11:06:00) [5]Оч просто - TComObject.CreateFromFactory
Alex_Ne (2007-11-14 10:53:00) [6]
> скажу тебе по великому секрету - не понадобится не только
> библ-ка типов, но и вообще какие-либо следы в реестрах,
> ни на стороне сервера ни на стороне контроллера.
И как-же реализуется загрузка сервера по запросу клиента, если в
реестре на стороне сервера никаких следов?
Alex_Ne (2007-11-14 10:41:00) [7]
> Этот способ действует для методов direct call методов со
> стековым фреймом.
> Для indirect методов (виртуальных методов) он не сработает.
>
> Для этого его нужно слегка модифицировать. Но сделать можно.
>
Методы всюду динамические. Специально попробовал объявить метод как виртуальный - все равно сработало (или я что-то не правильно понял?).
TMeth = class(TComponent)
published
procedure abc;virtual;
end;
TChMeth = class(TMeth)
published
procedure abc;override;
end;
Сергей М. (2007-11-14 10:36:00) [8]
> На самом деле от DCOM я давно отказался в пользу TSocketConnection
Малацца.
Осталось заточить BSS под свои нужды с учетом ciInternal.
Alex_Ne (2007-11-14 10:17:00) [9]
> А что тебя заклинило на DCOM ?
>
> Используй TSocketConnection и адаптированный под свои нужды
> BSS, тогда - скажу тебе по великому секрету - не понадобится
> не только библ-ка типов, но и вообще какие-либо следы в
> реестрах, ни на стороне сервера ни на стороне контроллера.
>
...............
На самом деле от DCOM я давно отказался в пользу TSocketConnection по означенным причинам и не только. Но сути это не меняет, а букоф меньше...
Сергей М. (2007-11-13 13:24:00) [10]
> Остается унифицировать как-то вызов методов и совсем все
> было бы в ажуре.
>
> Для этого и потребовалось решать означенную задачу
Невегной дорогой идете, товагищ, агхиневегной)
Засим откланиваюсь.
Сергей М. (2007-11-13 13:20:00) [11]
> имена методов дельфийских объектов
Точнее не имена , а адреса точек входа в эти методы.
Сергей М. (2007-11-13 13:13:00) [12]И вообще совершенно непонятно зачем апп-серверу знать имена методов дельфийских объектов
Сергей М. (2007-11-13 13:07:00) [13]
> универсальный подход не бывает оптимальным
А что тебя заклинило на DCOM ?
Используй TSocketConnection и адаптированный под свои нужды BSS, тогда - скажу тебе по великому секрету - не понадобится не только библ-ка типов, но и вообще какие-либо следы в реестрах, ни на стороне сервера ни на стороне контроллера. Плясать для этого нужно от TComObjectFactory.Instancing = ciInternal, тогда BSS будет создавать объект твоего app-сервера "на лету", безо всяких привязок к реестру. Контроллер же обращается к app-серверу через его диспинтерфейс, что также не требует привязки к реестру и библ-ке типов.
oxffff (2007-11-13 12:56:00) [14]
> Ответ на поставленный вопрос я уже получил [6].
Этот способ действует для методов direct call методов со стековым фреймом.
Для indirect методов (виртуальных методов) он не сработает.
Для этого его нужно слегка модифицировать. Но сделать можно.
Alex_Ne (2007-11-13 12:46:00) [15]to Сергей М. © (13.11.07 08:17) [19]
> Какие такие "стандартные" ?
Т.е. создаваемые и используемые ровно таким образом, как это предусматривает DCOM - универсальный подход не бывает оптимальным
для всех случаев жизни.
> Тебе чего надо-то ?
Goto (12.11.07 15:26)
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1194870400&n=0
> По запросу контроллера вернуть ему список имен диспинтерфейсных
> методов с целью последующих вызовов контроллером этих методов
> ?
Ответ на поставленный вопрос я уже получил [6]. Прочее офтоп.
Нет необходимости строить фантастические предположения -
если действительно интересны подробности - пиши на мыло.
oxffff (2007-11-13 08:46:00) [16]
> Ого. А что есть другие способы (средствами языка) возврата
> из процедуры в Delphi?
Исключения в расчет не брать.
oxffff (2007-11-13 08:45:00) [17]
> Сергей М. © (13.11.07 08:14) [18]
>
> > А тогда ret узнает об этом
>
>
> Организовать возврат в нужную точку можно и без RET.
Ого. А что есть другие способы (средствами языка) возврата из процедуры в Delphi?
oxffff (2007-11-13 08:33:00) [18]
> Сергей М. © (13.11.07 08:14) [18]
Этот форум про методы защиты?
Или про устройство виртуальных машин?
Сергей М. (2007-11-13 08:17:00) [19]
> Alex_Ne (12.11.07 17:33) [13]
> стандартные диспинтерфейсы
Какие такие "стандартные" ?
Тебе чего надо-то ?
По запросу контроллера вернуть ему список имен диспинтерфейсных методов с целью последующих вызовов контроллером этих методов ?
Сергей М. (2007-11-13 08:14:00) [20]
> А тогда ret узнает об этом
Организовать возврат в нужную точку можно и без RET.
> Извольте прочитать работу RET
Прямо сейчас бегу вприпрыжку)
И тебе настоятельно рекомендую ознакомиться с выкрутасами в передаче параметров и управления между подпрограммами, фигурирующей, к примеру, в алладиновой секции .protect - код, генерируемый компиляторами от Борланда, раем покажется)