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

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

Как работать с интерфейсами? [D7]


GrayFace ©   (2004-06-21 11:10:00) 

Сделал свой интерфейс. Сгенерил ['16-байтовый-ключ'], пишу
Sender:TObject

 (Sender as IMyInterface).

Ругается: Invalid Typecast.


clickmaker   (2004-06-21 11:35:00) [1]


> Наверное есть еще - сейчас не соображу...

Например
Sender.ComObject.QueryInterface(IID_IMyInterface, Intf)


Тимохов   (2004-06-21 11:28:00) [2]

во случае применения ответа [1] и НЕ применения специальных мер рискуете остаться без объекта sender. Дело в том, что после отработки as делается _addRef, а потом делается _release.
И если у вас sender это просто объект, имеющий на момент вызова as свойствао refcount равным 0, то после команды as объект у вас просто удалится (отработает деструктор). А далее - сами знаете, будут av.

Одно из решений - не мешать модель интрефейсов и модель объектов (как советует Эрик Хармон). Воторое решение - отказаться от подсчета ссылок сделав _addref и _release пусташками. Наверное есть еще - сейчас не соображу...


U   (2004-06-21 11:22:00) [3]

var intf: IMyInterface;

if Sender.GetInterface(IMyInterface, intf) then
begin
 intf.DoSomethng;
end;


clickmaker   (2004-06-21 11:13:00) [4]

TInterfacedObject(Sender) as IMyInterface


Наверх

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