Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создать базовый класс, основывающийся на IUnknown

Delphi , Технологии , COM и DCOM

Создать базовый класс, основывающийся на IUnknown

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

If I want automatic garbage collection with interfaces, I use
 TInterfacedObject as base class. What should I use,
 if I don''t want automatic destruction?
 is there a similar common base class or do I
 have to implement the IInterface methods myself?

 I use this one:

{== BaseNonRefcountIntfObjU ===========================================}
 {: This unit provides a base class with a non-reference counted 
implementation of IUnknown. 
@author Dr. Peter Below 
@desc Version 1.0 created 28 Mдrz 2002

Last modified 28 Mдrz 2002


}
 {======================================================================}

 unit BaseNonRefcountIntfObjU;

 interface

 type
   {: Derive classes that need a non-reference counted IUNknown 
     implementation from this class. }
   TNonRefcountInterfacedObject = class(TObject, IUnknown)
   protected
     { IUnknown }
     function QueryInterface(const IID : TGUID; out Obj): HResult;
       stdcall;
     function _AddRef: Integer; stdcall;
     function _Release: Integer; stdcall;
   end;

 implementation

 uses Windows;

 function TNonRefcountInterfacedObject.QueryInterface(const IID : TGUID;
   out Obj): HResult;
 begin
   if GetInterface(IID, Obj) then
     Result := S_OK
   else
     Result := E_NOINTERFACE
 end;

 function TNonRefcountInterfacedObject._AddRef: integer;
 begin
   Result := -1   // -1 indicates no reference counting is taking 
    place
 end;

 function TNonRefcountInterfacedObject._Release: integer;
 begin
   Result := -1   // -1 indicates no reference counting is taking 
    place
 end;

 end { BaseNonRefcountIntfObjU }.

Приведенный код определяет базовый класс TNonRefcountInterfacedObject, который реализует интерфейс IUnknown с поведением неиспользуемой автоматической подсчета ссылок.

Если вы хотите создать объект, который не использует автоматическую подсчет ссылок, вы можете派827 класс от этого базового класса. Это означает, что вам нужно будет реализовать методы QueryInterface, _AddRef и _Release самостоятельно.

Вот краткое описание каждого метода:

  1. QueryInterface: Этот метод используется клиентами для запроса интерфейса у вашего объекта. Он принимает IID (идентификатор интерфейса) в качестве входного параметра, который идентифицирует желаемый интерфейс, и возвращает указатель на этот интерфейс, если он существует. Если не существует, он возвращает E_ NOINTERFACE.
  2. _AddRef: Этот метод увеличивает счетчик ссылок вашего объекта. В этом базовом классе он просто возвращает -1, что указывает на то, что не происходит подсчет ссылок.
  3. _Release: Аналогично _AddRef, этот метод уменьшает счетчик ссылок. Опять же, в этом базовом классе он возвращает -1 для указания того, что не происходит подсчет ссылок.

Используя это базовое класс и реализуя эти методы самостоятельно, вы можете создавать объекты без автоматического сборки мусора при использовании интерфейсов.

Вот простой пример использования этого базового класса:

unit MyObject;

interface

type
  TMyObject = class(TNonRefcountInterfacedObject)
  protected
    function QueryInterface(const IID: TGUID; out Obj): HResult; override;
  end;

implementation

uses Windows;

function TMyObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  // Реализуйте свой обработчик интерфейса здесь
end;

end.

В этом примере TMyObject - это класс, который наследуется от TNonRefcountInterfacedObject. Он переопределяет метод QueryInterface, чтобы предоставить свою реализацию. Поскольку он не использует автоматическую подсчет ссылок, вам нужно будет управлять жизнью объекта вручную.

Помните, что при использовании интерфейсов без автоматического подсчета ссылок ответственность за очистку объектов от мусора лежит на вас. Это может включать реализацию деструктора или явное вызывание _Release для объекта, когда с ним больше не работает.

В статье рассматривается создание базового класса, не использующего автоматическое уничтожение объектов, и реализация интерфейса IUnknown в этом классе.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: COM и DCOM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:53:45/0.0055160522460938/1