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

Вниз

Классы и интерфейсы   Найти похожие ветки 

 
Начинающий программист ©   (2003-03-04 00:35) [0]

Народ, помогите начинающему программисту!
Как создать переменную класса (в смысле, переменную, общую для всех объектов даннго класса, типа vmt или похоже)?
Как добавить интерфейс в класс в процессе выполнения (в смысле, есть класс который реализует несколько интерфейсов, после запуска программы хочу добавить еще парочку)?
Как менять InterfaceTable в процессе выполнения программы?
Можно-ли менять vmt в процессе работы программы?
Если кто-нибудь знает, скиньте пожалуйста на stas@bosch-allateledel.hu
Заранее благодарен, Начинающий программист


 
Юрий Зотов ©   (2003-03-04 01:03) [1]

> Как создать переменную класса (в смысле, переменную, общую для
> всех объектов даннго класса, типа vmt или похоже)?

Сам класс и есть такая переменная. Класс - это просто указатель, содержащий адрес VMT.


> Как добавить интерфейс в класс в процессе выполнения (в
> смысле, есть класс который реализует несколько интерфейсов,
> после запуска программы хочу добавить еще парочку)?

Сам я этого не делал, но попробовал бы вот что. В VMT по смещению vmtIntfTable (см. топик VMT в справке и исходники System) находится адрес таблицы интерфейсов. Видимо, нужно поисследовать ее структуру и добавить новые элементы по образцу уже имеющихся. Конечно, память под нее надо будет перераспределить.


> Как менять InterfaceTable в процессе выполнения программы?

Изменить адрес, который хранится в VMT по смещению vmtIntfTable. Естественно, с перераспределением памяти.


> Можно-ли менять vmt в процессе работы программы?

Технических проблем здесь нет, и иногда этим пользуются (например, так можно напрямую вызвать виртуальный метод прародителя, минуя родителя, да и вообще какого-то класса, даже не являющегося предком). Только чревато это... кто его знает, что там вызванный метод делает? вдруг споткнется на чужой VMT? А уж менять VMT кардинально - это еще чреватее.


> Начинающий программист

Однако... ну прям совсем начинающий... интересные у начинающих программистов вопросы нынче пошли... из серии advanced, да еще и грамотно сформулированные, с пониманием предмета... ну прям совсем начинающий... побольше бы таких новичков...
:о)


 
Начинающий программист ©   (2003-03-04 01:53) [2]

>Конечно, память под нее надо будет перераспределить.

В этом то и проблемма.
Похоже на то, что vmt создается компилятором, и как увеличить ее размер (чтобы добавить свои переменные) я понятия не имею.
Кроме того vmt защищена от записи, читать-то ее можно, а вот писать -- никак, Делпхи ругается Access Violationam-и. Наверное это можно отключить, но я не знаю как. Я еще не копался в IntfTable, но в System я не нашел где под нее выделяется память, отчего возникают плохие предчувствия. Если даже в IntfTable писать можно, меня это не спасет, т.к. чтобы добать в нее свой интерфейс мне ее предется увеличить (сомневаюсь что она сделана с запасом :), и, следовательно, переписать указатель в vmt. Переформулирую вопрос: как менять значения в vmt и ее размер? Или, быть может, можно создать свою vmt на базе имеющийся и подсунуть ее конструктору (что явно не для начинающих программистов)?


 
Юрий Зотов ©   (2003-03-05 00:41) [3]

VMT, конечно же, создается компилятором. Как и все остальные таблицы времени исполнения. Да и вообще все, что относится ко времени испольнения. А чем же еще оно может создаваться?

Увеличивать размер самой VMT не нужно. Она состоит из указателей и нужно только менять значения этих указателей. Полагаю, это можно сделать либо через операции c указателями, либо через WriteProcessMemory. Таким же образом можно изменить и адрес Interface Table - только сначала нужно будет создать эту новую таблицу (скопировав в нее старую и добавив свои элементы) и освободить память, которую занимала старая.

Добавление же к VMT своих полей бессмысленно - компилятором они все равно не будут использованы, поскольку ему о них ничего не известно. А использовать их в СВОЕМ коде можно и так, без всякого добавления к VMT.

Вообще же, Вы правы - эта кухня действительно явно не для начинающих программистов. Да, честно говоря, я и продвинутым не стал бы советовать модифицировать такие вещи, как VMT или Interface Table. А посоветовал бы пересмотреть логику проекта. Уверен, что можно найти нормальное решения, без всяких хакерских фокусов (как показывает практика, его всегда можно найти). И что результат будет лучше, надежнее и совместим с любой новой версией Delphi (в которой структура таблицы интерфейсов запросто может измениться, а тогда код придется переписывать).


 
vuk ©   (2003-03-05 02:55) [4]

to Юрий Зотов:
>посоветовал бы пересмотреть логику проекта
Я ж сразу именно на то и намекал. Если всё нормально спроектировать, то все эти пляски с бубном вокруг VMT абсолютно ни к чему. Как динамически имитировать расширение числа интерфейсов, реализуемых объектом при помощи агрегирования я тоже уже намекал. В COM это стандартная практика...



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

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

Наверх




Память: 0.48 MB
Время: 0.018 c
1-54106
AlexT1000
2003-03-05 18:27
2003.03.17
Как получить дуступ из программы к protected методу класса?


6-54132
soho
2003-01-27 17:50
2003.03.17
whois


6-54148
Alex_AWS
2003-01-28 11:53
2003.03.17
Интернет


14-54195
maxtaran
2003-03-03 05:56
2003.03.17
HELP SOS HELP помогите разобраться с системным треем


3-53953
anton2v
2003-02-26 12:08
2003.03.17
CREATE TABLE ms.dbf (price number(18,2))