Einzelnen Beitrag anzeigen

Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#1

QueryInterface und RefCount

  Alt 30. Mai 2016, 11:28
Delphi-Version: 10 Seattle
Hallo Forum...

Ich versuche grad einen ca 900 Zeilen langen C++ Code nach Delphi zu übersetzen. Meinem ersten Gefühl nach ist der ganze folgende Code eigentlich nicht zwingend notwendig. Jedoch mag der Code insgesammt nicht funktionieren also versuche ich jetzt ob es damit vielleicht doch eine tiefere Bewandtnis hat. Dort ist Folgendes zu finden:

Code:
class IUnknownImpl: IUnknown {
public:
  IUnknownImpl(GUID guid):_guid(guid)
  {
  };

  HRESULT __stdcall QueryInterface(REFIID riid , void **ppObj)
  {
     if (riid == IID_IUnknown||riid == _guid)
      {
      *ppObj = this;
      AddRef() ;
      return S_OK;
      }
     *ppObj = NULL ;
     return E_NOINTERFACE ;
  }
 
  ULONG __stdcall AddRef () { return InterlockedIncrement(&m_nRefCount) ; }
  ULONG __stdcall Release () {
   long nRefCount=0;
   nRefCount=InterlockedDecrement(&m_nRefCount) ;
   if (nRefCount == 0) delete this;
   return nRefCount;
  }

private:
    long m_nRefCount;  //for managing the reference count
   GUID _guid;
};
Mein Lösungsansatz sieht bisher so aus, jedoch weiß ich beim besten Willen nicht was der Code eigentlich tut...

Delphi-Quellcode:
type
  TIAVInterface = class(TInterfacedObject)
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  private
    FGUID: TGUID;
  public
    constructor create(GUID: TGUID);
  end;

[..]

constructor TIAVInterface.create(GUID: TGUID);
begin
  inherited create();
  FGUID:=GUID;
end;

function TIAVInterface.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if (IID = FGUID) then // OR Teil ergänzen
  begin
    Obj:=Self; // Operator ist auf diesen Operandentyp nicht anwendbar
    _AddRef;
    Result:=S_OK;
  end
  else
  begin
    Obj:=nil;
    Result:= E_NOINTERFACE;
  end;
end;

function TIAVInterface._AddRef: Integer;
begin
  Result:=InterlockedIncrement(FRefCount);
end;

function TIAVInterface._Release: Integer;
begin
  Result:=InterlockedDecrement(FRefCount);
  if Result = 0 then
    Self.Free;
end;
In Query Interface läuft er auf einen Fehler. Bin ich mit meinem Ansatz wenigstens dicht dran?

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat