Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];

Вниз

Просвятите на что содержит ссылку переменная типа Interface   Найти похожие ветки 

 
Serginio   (2003-06-26 15:07) [0]

С преременными типа класса (Self) все понятно. Они содержат ссылку на область памяти (Структуру) данных объекта, первые 4 байта которых содержат ссылку на VMT.

Понятно, что переменная типа интерфейс должна ссылаться на структуру аналогичную TMethod типа
TIntfRecord = Record
Code:Pointer;// ссылка на VMT интерфейса
Data:Pointer;// ссылка на данные объекта
end;
или какието другие аналоги.
Просвятие. Заранее благодарен.


 
icWasya   (2003-06-26 15:32) [1]

поскольку переменная Interface не может содежать данные, то всё гораздо проще -
TIntfRecord = Pointer;// ссылка на VMT интерфейса

P + 0 - указатель на QueryInterface
P + 4 - указатель на AddRef
P + 8 - указатель на Release
P +12 - остальные методы


 
Serginio   (2003-06-26 15:55) [2]

2(icWasya © (26.06.03 15:32)) Интефейс без класса не сущесвует. Просто должна быть ссылка на данные что бы вызвать метод класса. Очень плохо знаю Ассемблер, Да может у меня в глазах, что то но вызывается Call dword ptr [p+12] c нечетным адресом.


 
Skier   (2003-06-26 16:04) [3]

см.
class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
class function GetInterfaceTable: PInterfaceTable;


 
Serginio   (2003-06-26 16:35) [4]

Спасибо Skir
TInterfaceEntry = packed record
IID: TGUID;
VTable: Pointer;
IOffset: Integer;
ImplGetter: Integer;
end;

Теперь осталось разобраться с
IOffset: Integer;
ImplGetter: Integer;

Я обязательно поэксперементирую, но хотелось бы узнать компетентное мнение.


 
Skier   (2003-06-26 16:39) [5]

Encapsulates the information needed to dispatch interface calls.

Unit

system

type
PInterfaceEntry = ^TInterfaceEntry;

TInterfaceEntry = packed record
IID: TGUID;
VTable: Pointer;
IOffset: Integer;
ImplGetter: Integer;

end;

Description

PInterfaceEntry is a pointer to a TInterfaceEntry record.

TInterfaceEntry contains the following fields:

IID: The GUID that uniquely identifies the interface.
VTable: The VTable to use for dispatching interface calls.
IOffset The offset of the interface in the implementing object.
ImplGetter A method pointer for accessing the interface if IOffset is not available.


 
Serginio   (2003-06-26 18:19) [6]

Все разобрался Self+IOffset это ссылка на заглушку которая подготавливает вызов метода класса. Только почему то с нечетным адресом. Не совсем рациональный подход Мое личное мнение.


 
Serginio   (2003-06-26 18:21) [7]

Вернее Self+IOffset ссылка на VMT заглушек реализующие реальные методы Класса.



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

Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
14-31403
sapsi
2003-06-18 08:55
2003.07.10
---|Ветка была без названия|---


1-31202
Шустрый
2003-06-27 19:14
2003.07.10
Form1.OnClose:=False ???


14-31472
vidiv
2003-06-24 08:16
2003.07.10
Где можно скачать фильм


1-31291
Antonyan
2003-06-26 15:06
2003.07.10
Индустриальные VCL


1-31311
Igor_P
2003-06-26 19:21
2003.07.10
Округление до 10-и, 5-и





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский