![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить указатель на объект из интерфейса
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]В общем случае - никак.
В частно случае - если это твой интерфейс и реализация
сделай на интервейсе такой метов - вернуть объект
Но это на самом деле не правильно.