Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   E2003 Undefinierter Bezeichner: 'QueryInterface' (https://www.delphipraxis.net/194379-e2003-undefinierter-bezeichner-queryinterface.html)

MacGuyver 13. Nov 2017 21:29

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:
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.
Wieso wirft er "E2003"?

Fritzew 13. Nov 2017 21:37

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
 
Leite von TInterfacedObject ab

Delphi-Quellcode:
{ TInterfacedObject provides a threadsafe default implementation
  of IInterface. You should use TInterfaceObject as the base class
  of objects implementing interfaces. }

  TInterfacedObject = class(TObject, IInterface)
Diese Methoden werden von einem Interface im normal Fall erwartet :

Delphi-Quellcode:
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
und TInterfacedObject stellt Dir diese zur verfügung

Aviator 13. Nov 2017 21:39

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
 
Delphi-Quellcode:
var
  t : TTest;  // <--- Mach hieraus mal ein ITest
begin
  t := TTest.Create;
  try
    t.DoTest;
  finally
    t.Free; // Wirf das komplett raus
  end;
end.
Interface Instanzen arbeiten mit einem Referenzzähler. Das was du jetzt hier gerade hingeschrieben hast macht so leider keinen Sinn.

Dann musst du aus
Delphi-Quellcode:
 TTest = class (TObject, ITest)
folgendes machen:
Delphi-Quellcode:
 TTest = class (TInterfacedObject, ITest)
Also von
Delphi-Quellcode:
TInterfacedObject
ableiten.

EDIT: RedBox :gruebel:

Fritzew 13. Nov 2017 21:42

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
 
Zitat:

Zitat von Aviator (Beitrag 1386165)
[DELPHI]var
t : TTest; // <--- Mach hieraus mal ein ITest
EDIT: RedBox :gruebel:

Das hatte ich gar nicht gesehen,
redBox also kein Problem... ;-)

Aviator 13. Nov 2017 21:45

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
 
Zitat:

Zitat von Fritzew (Beitrag 1386167)
Zitat:

Zitat von Aviator (Beitrag 1386165)
[DELPHI]var
t : TTest; // <--- Mach hieraus mal ein ITest
EDIT: RedBox :gruebel:

Das hatte ich gar nicht gesehen,
redBox also kein Problem... ;-)

Insofern auch wieder wahr. :mrgreen:

Eventuell könnte man auch noch dazu sagen, dass ein
Delphi-Quellcode:
t := nil
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.

MacGuyver 13. Nov 2017 21:56

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'
 
Wozu soll ich
Delphi-Quellcode:
t : TTest;
in
Delphi-Quellcode:
t : ITest;
umwandeln? Im Beispiel geht es doch nur darum, dass das Interface so nicht zu kompilieren war.
Wie ist das überhaupt noch mit der "is"-Abfrage?
Delphi-Quellcode:
if t is ITest then ...
will er nicht so richtig.

Aviator 13. Nov 2017 22:03

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:
is
Abfrage die
Delphi-Quellcode:
Supports()
Methode nutzen. Die prüft dann entsprechend, ob die Instanz die du übergibst das entsprechende Interface unterstützt.

DeddyH 14. Nov 2017 06:36

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