Delphi-Version: 2006
E2003 Undefinierter Bezeichner: 'QueryInterface'
Moin Leute :hi:
Irgendwie bekomme ich das mit dem Interface nicht hin. Ich habe mir etliche Beispiele angeschaut und verstehe nicht, was ich falsch mache:
Delphi-Quellcode:
Wieso wirft er "E2003"?
program TestInterface;
{$APPTYPE CONSOLE} uses SysUtils; type ITest = interface ['{A6C342E9-61FE-404C-BAB2-7618E6387E5F}'] procedure DoTest; end; TTest = class (TObject, ITest) procedure DoTest; end; { TTest } procedure TTest.DoTest; begin end; var t : TTest; begin t := TTest.Create; try t.DoTest; finally t.Free; end; end. |
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Leite von TInterfacedObject ab
Delphi-Quellcode:
Diese Methoden werden von einem Interface im normal Fall erwartet :
{ TInterfacedObject provides a threadsafe default implementation
of IInterface. You should use TInterfaceObject as the base class of objects implementing interfaces. } TInterfacedObject = class(TObject, IInterface)
Delphi-Quellcode:
und TInterfacedObject stellt Dir diese zur verfügung
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; |
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Delphi-Quellcode:
Interface Instanzen arbeiten mit einem Referenzzähler. Das was du jetzt hier gerade hingeschrieben hast macht so leider keinen Sinn.
var
t : TTest; // <--- Mach hieraus mal ein ITest begin t := TTest.Create; try t.DoTest; finally t.Free; // Wirf das komplett raus end; end. Dann musst du aus
Delphi-Quellcode:
folgendes machen:
TTest = class (TObject, ITest)
Delphi-Quellcode:
Also von
TTest = class (TInterfacedObject, ITest)
Delphi-Quellcode:
ableiten.
TInterfacedObject
EDIT: RedBox :gruebel: |
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Zitat:
redBox also kein Problem... ;-) |
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Zitat:
Eventuell könnte man auch noch dazu sagen, dass ein
Delphi-Quellcode:
am Schluss hinzugefügt werden könnte. Macht aber eigentlich nur dann Sinn wenn es sich nicht um eine lokale Variable handelt. Ansonsten bleibt der Referenzzähler auf 1 (oder höher) und dann wird nicht alles sauber freigegeben.
t := nil
|
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Wozu soll ich
Delphi-Quellcode:
in
t : TTest;
Delphi-Quellcode:
umwandeln? Im Beispiel geht es doch nur darum, dass das Interface so nicht zu kompilieren war.
t : ITest;
Wie ist das überhaupt noch mit der "is"-Abfrage?
Delphi-Quellcode:
will er nicht so richtig.
if t is ITest then ...
|
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Wenn du mit Interfaces arbeiten willst, dann musst du auch den Typen des Interfaces nutzen. Sonst bringt dir das nichts. :wink:
Bei Interfaces kannst du anstatt der
Delphi-Quellcode:
Abfrage die
is
Delphi-Quellcode:
Methode nutzen. Die prüft dann entsprechend, ob die Instanz die du übergibst das entsprechende Interface unterstützt.
Supports()
|
AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
Vielleicht wird es so etwas klarer:
Delphi-Quellcode:
program TestInterface;
{$APPTYPE CONSOLE} uses SysUtils; type ITest = interface ['{A6C342E9-61FE-404C-BAB2-7618E6387E5F}'] procedure DoTest; end; IDings = interface ['{A5F98113-D65A-4268-98E4-B43FC4D5FA3B}'] procedure DoDings; end; TTest = class(TInterfacedObject, ITest, IDings) procedure DoTest; procedure DoDings; end; { TTest } procedure TTest.DoTest; begin writeln('Methode DoTest von ITest'); end; procedure TTest.DoDings; begin writeln('Methode DoDings von IDings'); end; var t: ITest; d: IDings; begin t := TTest.Create; t.DoTest; if Supports(t, IDings, d) then d.DoDings; readln; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz