Форум: "Основная";
Текущий архив: 2003.03.17;
Скачать: [xml.tar.bz2];
ВнизКлассы и интерфейсы Найти похожие ветки
← →
Начинающий программист (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c