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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.094 c
8-1157428625
Irinka
2006-09-05 07:57
2007.05.20
Как загрузить png в Image без дополнительных компонент?


2-1177585517
Marat
2007-04-26 15:05
2007.05.20
Округлить


2-1178185619
Alanu
2007-05-03 13:46
2007.05.20
как определить имя компонента


2-1177733162
Cj
2007-04-28 08:06
2007.05.20
Программа открывающая файл


2-1177501570
iviom
2007-04-25 15:46
2007.05.20
Написать свой компонент, состоящий из стандартных





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