Is there a non-reference-counted base class like TInterfacedObject?

前端 未结 5 1272
无人及你
无人及你 2021-02-07 08:47

I need a base class like TInterfacedObject but without reference counting (so a kind of TNonRefCountedInterfacedObject).

This actually is the

5条回答
  •  遥遥无期
    2021-02-07 09:23

    I did this. It can be used in place of TInterfacedObject with or without reference counting. It also has a name property - very useful when debugging.

    // TArtInterfacedObject
    // =============================================================================
    
    
    // An object that supports interfaces, allowing naming and optional reference counting
    type
      TArtInterfacedObject = class( TInterfacedObject )
        constructor Create( AReferenceCounted : boolean = True);
      PRIVATE
        FName             : string;
        FReferenceCounted : boolean;
      PROTECTED
        procedure SetName( const AName : string ); virtual;
      PUBLIC
    
        property Name : string
                   read FName
                   write SetName;
    
        function QueryInterface(const AGUID : TGUID; out Obj): HResult; stdcall;
        function SupportsInterface( const AGUID : TGUID ) : boolean;
        function _AddRef: Integer; stdcall;
        function _Release: Integer; stdcall;
    
      end;
    
    // =============================================================================
    
    
    
    
    { TArtInterfacedObject }
    
    constructor TArtInterfacedObject.Create( AReferenceCounted : boolean = True);
    begin
      inherited Create;
    
      FName := '';
    
      FReferenceCounted := AReferenceCounted;
    end;
    
    function TArtInterfacedObject.QueryInterface(const AGUID: TGUID; out Obj): HResult;
    const
      E_NOINTERFACE = HResult($80004002);
    begin
      If FReferenceCounted then
        Result := inherited QueryInterface( AGUID, Obj )
       else
        if GetInterface(AGUID, Obj) then Result := 0 else Result := E_NOINTERFACE;
    end;
    
    
    procedure TArtInterfacedObject.SetName(const AName: string);
    begin
      FName := AName;
    end;
    
    function TArtInterfacedObject.SupportsInterface(
      const AGUID: TGUID): boolean;
    var
      P : TObject;
    begin
      Result := QueryInterface( AGUID, P ) = S_OK;
    end;
    
    
    function TArtInterfacedObject._AddRef: Integer;
    begin
      If FReferenceCounted then
        Result := inherited _AddRef
       else
        Result := -1   // -1 indicates no reference counting is taking place
    end;
    
    function TArtInterfacedObject._Release: Integer;
    begin
      If FReferenceCounted then
        Result := inherited _Release
       else
        Result := -1   // -1 indicates no reference counting is taking place
    end;
    
    
    // =============================================================================
    

提交回复
热议问题