Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-53873
vanek_VS
2003-02-25 08:28
2003.03.17
Дата не работает


7-54354
Роман Фадеев
2002-12-09 17:42
2003.03.17
Не могу перехватить WM_CONTEXTMENU в TWebBrowser


1-54040
Спрашивающий
2003-03-04 01:26
2003.03.17
Повторю вопрпос:Взаимодействие OpenDialog и функции DiskFree(0)


1-54086
Nehto
2003-03-05 15:15
2003.03.17
Obrabotka SCV-fila


14-54251
Sha
2003-02-28 10:53
2003.03.17
Високосный год. Головоломка.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский