AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language E2003 Undefinierter Bezeichner: 'QueryInterface'
Thema durchsuchen
Ansicht
Themen-Optionen

E2003 Undefinierter Bezeichner: 'QueryInterface'

Ein Thema von MacGuyver · begonnen am 13. Nov 2017 · letzter Beitrag vom 14. Nov 2017
Antwort Antwort
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#1

E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 21:29
Delphi-Version: 2006
Moin Leute

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"?
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 21:37
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
Fritz Westermann

Geändert von TBx (14. Nov 2017 um 06:33 Uhr) Grund: Full-Quote entfernt
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 21:39
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  TTest = class (TObject, ITest) folgendes machen:  TTest = class (TInterfacedObject, ITest) Also von TInterfacedObject ableiten.

EDIT: RedBox
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 21:42
[DELPHI]var
t : TTest; // <--- Mach hieraus mal ein ITest
EDIT: RedBox
Das hatte ich gar nicht gesehen,
redBox also kein Problem...
Fritz Westermann
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 21:45
[DELPHI]var
t : TTest; // <--- Mach hieraus mal ein ITest
EDIT: RedBox
Das hatte ich gar nicht gesehen,
redBox also kein Problem...
Insofern auch wieder wahr.

Eventuell könnte man auch noch dazu sagen, dass ein 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.
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 21:56
Wozu soll ich
t : TTest; in
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?
if t is ITest then ... will er nicht so richtig.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 13. Nov 2017, 22:03
Wenn du mit Interfaces arbeiten willst, dann musst du auch den Typen des Interfaces nutzen. Sonst bringt dir das nichts.

Bei Interfaces kannst du anstatt der is Abfrage die Supports() Methode nutzen. Die prüft dann entsprechend, ob die Instanz die du übergibst das entsprechende Interface unterstützt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: E2003 Undefinierter Bezeichner: 'QueryInterface'

  Alt 14. Nov 2017, 06:36
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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