Текущий архив: 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.47 MB
Время: 0.035 c