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

Вниз

Просвятите на что содержит ссылку переменная типа 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
1-31340
Um
2003-06-26 07:42
2003.07.10
интерпретатор Delphi


7-31545
Michael_V
2003-04-21 13:39
2003.07.10
как запретить закрытие приложения по Alt+F4 и ........


14-31437
Mike B.
2003-06-23 13:41
2003.07.10
Поэзия


1-31275
Астра
2003-06-26 11:30
2003.07.10
Поддержка нескольких языков в приложении


14-31477
Sergey-ZZZ
2003-06-24 13:56
2003.07.10
Графики