Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить указатель на объект из интерфейса


Midnighter ©   (2007-03-25 16:42:00) 

Добрый день!

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


MyInterface := MyObject as IMyInterface;


а обратно?


Darvin   (2007-03-27 18:01:00) [1]

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

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

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


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


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


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

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

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


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


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


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

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

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


GrayFace   (2007-03-26 15:02:00) [4]

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

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

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

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


oxffff   (2007-03-26 09:01:00) [5]


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


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

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


oxffff   (2007-03-26 08:50:00) [6]


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



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


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

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

Но ник


Джо   (2007-03-25 21:21:00) [7]

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

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

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


Midnighter   (2007-03-25 21:11:00) [8]

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

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


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


> oxffff ©


> Не правда.


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


oxffff   (2007-03-25 18:43:00) [10]


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


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

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

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

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


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


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

см. Tcomponent и IInterfaceComponentReference


oxffff   (2007-03-25 18:43:00) [11]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо