Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.21;
Скачать: CL | DM;

Вниз

Отключить автоматические 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1260406003
XXL
2009-12-10 03:46
2010.02.21
Ищу иконки кнопок клавиатуры


11-1174919254
ElectriC
2007-03-26 18:27
2010.02.21
Горизонтальная полоса прокрутки в ListBox


9-1183470560
THandle
2007-07-03 17:49
2010.02.21
DirectX


4-1229418864
belmol
2008-12-16 12:14
2010.02.21
FTRAPI.dll ftrScanAPI.dll


1-1208960265
Zoom
2008-04-23 18:17
2010.02.21
Delphi7 и Unicode