Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение адреса метода изнутри


Страницы:   1 2

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  - код, генерируемый компиляторами от Борланда, раем покажется)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо