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

Вниз

Получить указатель на объект из интерфейса   Найти похожие ветки 

 
Midnighter ©   (2007-03-25 16:42) [0]

Добрый день!

Вопрос следующий - как получить указатель на оригинальный объект, имея только указатель на один из его интерфейсов?


MyInterface := MyObject as IMyInterface;


а обратно?


 
_Аноним   (2007-03-25 18:30) [1]

В общем случае - никак.
В частно случае - если это твой интерфейс и реализация
сделай на интервейсе такой метов - вернуть объект
Но это на самом деле не правильно.


 
oxffff ©   (2007-03-25 18:43) [2]


> В общем случае - никак.


Не правда.
Посмотрите под отладчиком.

mov ecx,[eax]
call [eax+MethodOffset] - вызов процедуры "подстройки eax".

Обычно там
add eax,-Offset - после в eax адрес объекта
jmp Method

Далее думаю понятно.


> сделай на интервейсе такой метов - вернуть объект
> Но это на самом деле не правильно.


Кто сказал? Такая тактика применяется и оправдана.

см. Tcomponent и IInterfaceComponentReference


 
oxffff ©   (2007-03-25 18:43) [3]

Опечатка
call [ecx+MethodOffset] - вызов процедуры "подстройки eax".


 
_Аноним   (2007-03-25 20:59) [4]


> oxffff ©


> Не правда.


А если интерфейс реализован в DLL, которая скомпилирована например с C++?
Как там получить "объект" ?


 
Midnighter ©   (2007-03-25 21:11) [5]

Способ должен быть, ведь ссылка-интерфейс это ведь по сути ссылка на
объект и таблицу адресов методов. Таблица адресов методов одна для класса-реализатора, при их вызове этим методам ведь нужно (первым параметром в стеке) передавать ссылку на конкретный объект.

Я просто думал есть простая штука вроде
GetObject(MyInterface)


 
Джо ©   (2007-03-25 21:21) [6]

> [5] Midnighter ©   (25.03.07 21:11)

> Я просто думал есть простая штука вроде
> GetObject(MyInterface)

Собственно, в общем случае, за интерефейсом может и не стоять никакого «объекта» в том смысле, какой смысл этому слову придается в Delphi.


 
oxffff ©   (2007-03-26 08:50) [7]


>
> А если интерфейс реализован в DLL, которая скомпилирована
> например с C++?
> Как там получить "объект" ?



> Способ должен быть, ведь ссылка-интерфейс это ведь по сути
> ссылка на
> объект и таблицу адресов методов


Интерфейс это двойной указатель на таблицу.
Явной ссылки на объект он не содержит.

В С++ аналогично.

Но ник


 
oxffff ©   (2007-03-26 09:01) [8]


> А если интерфейс реализован в DLL, которая скомпилирована
> например с C++?
> Как там получить "объект" ?


Еще один способ.
Модифицируем таблицу интерфейса, заполняя адресом Intercept функции, сохранив оригинальные значения.

Далее как обычно.


 
GrayFace ©   (2007-03-26 15:02) [9]

oxffff ©   (26.03.07 08:50) [7]
Интерфейс это двойной указатель на таблицу.

Указатель как указатель. Что значит двойной?

oxffff ©   (26.03.07 09:01) [8]
Еще один способ.
Модифицируем таблицу интерфейса, заполняя адресом Intercept функции, сохранив оригинальные значения.

А что такое intercept функции?


 
oxffff ©   (2007-03-26 16:00) [10]


> Указатель как указатель. Что значит двойной?


Указатель на Указатель = двойной указатель

>А что такое intercept функции?

Функция перехватчик.


 
oxffff ©   (2007-03-26 16:00) [11]


> Указатель как указатель. Что значит двойной?


Указатель на Указатель = двойной указатель

>А что такое intercept функции?

Функция перехватчик.


 
Darvin ©   (2007-03-27 18:01) [12]

IMy = interface
 ...
 function GetSelf : TObject;
end;

TMy = class (TAnsestor, IMY)
 function GetSelf : TObject;
end;

function TMy.GetSelf : TObject;
begin
  Result := Self;
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.031 c
15-1177056559
infom
2007-04-20 12:09
2007.05.20
Механизм отображения "красивого" графа


1-1174985012
Amateur
2007-03-27 12:43
2007.05.20
Преобразование TBlobStream в TStream


2-1178266462
SerMaxx
2007-05-04 12:14
2007.05.20
Как работать с графиками


2-1178204925
RomanLN
2007-05-03 19:08
2007.05.20
как отменить нажатие кнопки закрыть?


2-1178183234
Bad_B
2007-05-03 13:07
2007.05.20
Массив