Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
15-1260628418
Petr V. Abramov
2009-12-12 17:33
2010.02.21
проблема с firefox


2-1261130070
pg81
2009-12-18 12:54
2010.02.21
Как проверить существет ли еще форма в frm:TMyTypeForm?


2-1261139465
ford
2009-12-18 15:31
2010.02.21
TIdHTTP и Transfer-Encoding: chunked


15-1260687545
Урсулапов_
2009-12-13 09:59
2010.02.21
Как программно отключить и подключить устройство USB?


15-1258133607
М. Береговой
2009-11-13 20:33
2010.02.21
Электроны сталкиваются?





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