![]() |
AW: Problem mit automatischem freigeben von Interfaces
Zitat:
"Const" ist eines der wenigen Mittel, mit den man in Delphi überhaupt mit Interfaces arbeiten konnte, wenn man nicht komplett RefCounting genutzt hatte. |
AW: Problem mit automatischem freigeben von Interfaces
Aber nur doch wenn man schon eine Interface-Referenz hat, welche man da übergeben kann.
Wenn erst soeine Instanz erstellt werden muß, dann sollte diese auch mit gezählt werden, da sie vor der Übergabe lokl in einer temporären Variable zwischengespeichert wird. :gruebel: [edit] Das überrascht mich jetzt aber, da ist wirklich kein AddRef :shock:
Delphi-Quellcode:
type
ITest = interface ['{CB192645-8A70-4AB5-8EDD-ADD0304EDC27}'] end; TTest = class(TObject, ITest) FRefCount: Integer; function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; class procedure Test1(const Intf: ITest); class procedure Test2(Intf: ITest); end; function TTest.QueryInterface(const IID: TGUID; out Obj): HResult; begin ShowMessage('QueryInterface' + GUIDToString(IID)); if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; function TTest._AddRef: Integer; begin Inc(FRefCount); ShowMessage('_AddRef ' + IntToStr(FRefCount)); end; function TTest._Release: Integer; begin Dec(FRefCount); ShowMessage('_Release ' + IntToStr(FRefCount)); end; class procedure TTest.Test1(const Intf: ITest); begin if Assigned(Intf) then ; ShowMessage('call Test1'); end; class procedure TTest.Test2(Intf: ITest); begin if Assigned(Intf) then ; ShowMessage('call Test2'); end; procedure TForm11.Button2Click(Sender: TObject); var T: TTest; I: ITest; begin ShowMessage('create-o'); T := TTest.Create; ShowMessage('Test1-o'); TTest.Test1(T); ShowMessage('Test2-o'); TTest.Test2(T); ShowMessage('I:='); I := T; ShowMessage('Test1-i'); TTest.Test1(I); ShowMessage('Test2-i'); TTest.Test2(I); ShowMessage('nil'); I := nil; ShowMessage('Free'); T.Free; ShowMessage('create-i'); I := TTest.Create; ShowMessage('nil'); I := nil; ShowMessage('End'); end; |
AW: Problem mit automatischem freigeben von Interfaces
Zitat:
Deshalb muss da kein _AddRef oder _Release ausgeführt werden. Diese 2 Methoden werden innnerhalb von DoSomething aufgerufen, nicht davor/danach. Dass hierbei etwas temporär irgendwo abgelegt wird ist doch unerheblich? Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz