Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
ВнизОтключить автоматические AddRef и Release в Delphi? Найти похожие ветки
← →
Дмитрий С (2009-03-30 11:31) [0]Можно как-нибудь выключить автоматические вызовы AddRef и Release при работе с интерфейсами?
← →
Ins © (2009-03-30 11:37) [1]Использовать в качестве базового класса TInterfacedPersistent, TComponent или самому (лучше) переопределить _AddRef/_Release, чтобы они просто возвращали -1. А когда нарвешься на баг:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1312
можешь попробовать такое решение:
http://ins911.blogspot.com/2008/06/blog-post.html
← →
Ins © (2009-03-30 11:40) [2]
> Можно как-нибудь выключить автоматические вызовы AddRef
> и Release при работе с интерфейсами?
Но это просто для того, чтобы не вести учет ссылок для автоматического уничтожения при обнулении счетчика. А отключить вызовы нельзя никак.
← →
Дмитрий С (2009-03-30 11:47) [3]
> Но это просто для того, чтобы не вести учет ссылок для автоматического
> уничтожения при обнулении счетчика. А отключить вызовы нельзя
> никак.
Вот вот.
Я просто хочу, чтобы примерно такой код:
var
SomeObj: ISomeObj;
...
SomeObj := GetSomeObj();
не вызывал неявно SomeObj._AddRef();
← →
Сергей М. © (2009-03-30 12:21) [4]
> Дмитрий С (30.03.09 11:31)
Странного хочешь.
Автоподсчет ссылок - это "родное" для интерфейсных объектов поведение, и нет никакого резона для подобного рода кастрации
← →
Ins © (2009-03-30 12:30) [5]
> Автоподсчет ссылок - это "родное" для интерфейсных объектов
> поведение, и нет никакого резона для подобного рода кастрации
Я, кстати, тоже странного хотел бы :) А именно, чтобы как в Delphi.NET IInterface и IUnknown не были псевдонимами одного типа, а чтобы для IInterface все эти COM-овские заморочки не действовали, ведь далеко не всегда подсчет ссылок нужен. От него одни проблемы, когда время жизни объекта управляется другим образом. Ссылка на проблемы - выше :)
← →
Игорь Шевченко © (2009-03-30 13:44) [6]наследовать реализатора от TComponent и всех дел. Оно там уже переопределено.
← →
oxffff © (2009-03-30 14:00) [7]
> Дмитрий С (30.03.09 11:31)
> Можно как-нибудь выключить автоматические вызовы AddRef
> и Release при работе с интерфейсами?
Можно, делая weak assign.
var
SomeObj: ISomeObj;
...
Pointer(SomeObj):= GetSomeObj() или
Pointer(SomeObj):= Pointer(GetSomeObj()) в зависимости от того, что возвращает GetSomeObj
← →
Дмитрий С (2009-03-30 18:29) [8]
> oxffff © (30.03.09 14:00) [7]
Способ интересный. Но, во-первых, судя по предыдущим сообщениям мало кем используется, а во-вторых не дает возможности передавать интерфейсы в параметрах функций, разве что только как-нибудь так:
procedure UseObject(pObj: Pointer);
var
Obj: IUnknown absolute pObj;
begin
...
end;
> Сергей М. ©
> Игорь Шевченко © (30.03.09 13:44) [6]
Речь идет не о создании реализации, а об использовании интерфейсов "чужих" объектов. Т.е. я хочу сам вызывать _AddRef перед началом работы с интерфейсом и сам вызывать _Release по-завершении.
← →
Игорь Шевченко © (2009-03-30 18:32) [9]
> Речь идет не о создании реализации, а об использовании интерфейсов
> "чужих" объектов. Т.е. я хочу сам вызывать _AddRef перед
> началом работы с интерфейсом и сам вызывать _Release по-
> завершении.
А простое объявление переменной и присвоение ей ссылки на интерфейс не помогает ?
← →
oxffff © (2009-03-30 19:58) [10]
> Дмитрий С (30.03.09 18:29) [8]
>
> > oxffff © (30.03.09 14:00) [7]
>
> Способ интересный. Но, во-первых, судя по предыдущим сообщениям
> мало кем используется, а во-вторых не дает возможности передавать
> интерфейсы в параметрах функций, разве что только как-нибудь
> так:
>
> procedure UseObject(pObj: Pointer);
> var
> Obj: IUnknown absolute pObj;
> begin
> ...
> end;
Про кем то мало используется я не понял.
Это что правило?
1. есть const typed параметры. Где нет _addref/_release вызовов.
procedure UseObject(const pObj:Iunkown);
2. есть const untyped параметр
procedure UseObject(const pObj);
← →
oxffff © (2009-03-30 20:12) [11]
> Речь идет не о создании реализации, а об использовании интерфейсов
> "чужих" объектов. Т.е. я хочу сам вызывать _AddRef перед
> началом работы с интерфейсом и сам вызывать _Release по-
> завершении.
А если еще понимать, что как устроен интерфейс, то вот тебе решение.
Пример как в наглую убрать семантику копирования
и использовать класс вместо интерфейса.
Вот весь код.
Tiunknown=class
public
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual;stdcall;abstract;
function _AddRef: Integer; virtual;stdcall;abstract;
function _Release: Integer; virtual;stdcall;abstract;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:Tiunknown;
begin
//приводим интерфейс к псевдо-объекту
a:=pointer(iunknown(tinterfacedobject.create));
a._AddRef;
//Работаем с А, как с обычным объектом.
.........
a._Release;
end;
← →
oxffff © (2009-03-30 20:14) [12]
> oxffff © (30.03.09 20:12) [11]
to Дмитрий С
Естественно тебе нужно объявить псевдо класс для твоего интерфейса.
Блин, ты тут с какой то мелочью заморачиваешься, а у меня дела очень серьезные - дверь вставляю. :))))))))
← →
oxffff © (2009-03-30 20:22) [13]
> а у меня дела очень серьезные - дверь вставляю. :))))))))
А помочь мне некому. :(
← →
b z (2009-03-30 20:42) [14]
> oxffff © (30.03.09 20:22) [13]
Главное, что бы уровни косяки держали, тогда и дверь станет без проблем, да и висеть будет правильно. Помог? :)
← →
oxffff © (2009-03-30 20:50) [15]
> b z (30.03.09 20:42) [14]
Мне просто нужно помочь было поддержать ее при установке.
Нужно выдержвать определенный выступ наружу.
Вообщем уже выкрутился. Поставил на распорки.
Сейчас засверлю и порядок. :)
← →
Дмитрий С (2009-03-31 05:03) [16]
>
> Вот весь код.
>
> Tiunknown=class
> public
> function QueryInterface(const IID: TGUID; out Obj): HResult;
> virtual;stdcall;abstract;
> function _AddRef: Integer; virtual;stdcall;abstract;
> function _Release: Integer; virtual;stdcall;abstract;
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> var a:Tiunknown;
> begin
> //приводим интерфейс к псевдо-объекту
> a:=pointer(iunknown(tinterfacedobject.create));
>
> a._AddRef;
>
> //Работаем с А, как с обычным объектом.
> .........
> a._Release;
> end;
Это что-то новенькое. Разве так можно вообще?
← →
oxffff © (2009-03-31 11:39) [17]
> Разве так можно вообще?
Можно. С отдним уточнением.
Нельзя вызывать виртуальные методы по отрицательным смещениям и статичные методы.
А вызывать можно только методы интерфейса объявленные в классе как
> function QueryInterface(const IID: TGUID; out Obj): HResult;
> virtual;stdcall;abstract;
> function _AddRef: Integer; virtual;stdcall;abstract;
> function _Release: Integer; virtual;stdcall;abstract;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c