AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Interface nur unter bestimmten Bedingungen unterstützen

Interface nur unter bestimmten Bedingungen unterstützen

Ein Thema von Muzel · begonnen am 25. Jun 2015 · letzter Beitrag vom 2. Jul 2015
Antwort Antwort
Muzel

Registriert seit: 6. Mai 2011
3 Beiträge
 
#1

Interface nur unter bestimmten Bedingungen unterstützen

  Alt 25. Jun 2015, 14:34
Gibt es eine Möglichkeit, ein Interface nur unter bestimmten Bedingungen zu unterstützen?
Ich habe es folgendermaßen versucht:
- das Interface mit seinen Methoden in meiner Klasse implementiert
- QueryInterface in der Klasse überschrieben:

function MyClass.QueryInterface (const IID: TGUID; out Obj): HResult;
begin
if IsEqualGUID (IID, ITheInterface) then
begin
// hier könnte ich meine Bedingungen prüfen
Result := E_NOINTERFACE;
Pointer(Obj) := nil;
end
else
Result := inherited QueryInterface (IID, Obj);
end;

Was ich nicht verstehe: Obwohl bei der Supports-Abfrage der Code durchlaufen wird (also E_NOINTERFACE) zurückkommt, gibt Support True zurück und das Obj ist nicht nil.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.899 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 25. Jun 2015, 14:50
Das solltest du nicht tun, denn damit verletzt du eine Regel für Interfaces:

Zitat:
The set of interfaces accessible on an object through QueryInterface must be static, not dynamic. This means that if a call to QueryInterface for a pointer to a specified interface succeeds the first time, it must succeed again, and if it fails the first time, it must fail on all subsequent queries.
IUnknown::QueryInterface method
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.958 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 25. Jun 2015, 15:08
Was willst Du den damit erreichen?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.364 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 25. Jun 2015, 15:15
Vielleicht hat er Ideen wie eine Klasse die mit irgendetwas kommuniziert. Dazu ein Interface IDingsKommunikator . Wenn allerdings der Stecker draußen ist, kann es nicht kommunizieren. Und unterstützt das Interface nicht.

Solche Ideen hatte ich auch mal. Stellte sich aber wirklich als Schnapsidee heraus.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.899 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 25. Jun 2015, 15:19
Ein Problem sehe ich darin, wenn sich jemand das Interface holt wenn es gerade unterstützt wird, sich der Zustand aber dann so ändert, daß es nicht mehr unterstützt wird. Das Interface bleibt dann weiterhin gültig und es werden immer noch die entsprechenden Methoden aufgerufen. Also muss man die Bedingung dann immer noch prüfen und hat nichts gewonnen.

Besser dem Interface eine zusätzliche Funktion spendieren (z.B. IsValid), die sagt, ob man es gerade benutzen darf.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#6

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 25. Jun 2015, 16:49
Besser dem Interface eine zusätzliche Funktion spendieren (z.B. IsValid), die sagt, ob man es gerade benutzen darf.
Und eine InvalidOperationException , die von den betreffenden Schnittstellenfunktionen geworfen wird.
  Mit Zitat antworten Zitat
Muzel

Registriert seit: 6. Mai 2011
3 Beiträge
 
#7

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 26. Jun 2015, 07:10
Ok, danke, ihr habt mich überzeugt.
aber ich wüsste schon gern, warum sich die Supports-Funktion so seltsam verhält.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.364 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 26. Jun 2015, 09:23
Kannst du mal deinen vollständigen Quelltext posten? Welches QueryInterface wird denn zur Laufzeit benutzt? Ich denke mal, du hast vergessen, in deiner Klassendefinition IInterface anzugeben, oder?+

Hier mal ein Beispiel:
Delphi-Quellcode:
program SupportsProject;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
   IMyInterface = interface
   ['{03A20C4F-400C-462F-B10D-D19B01E82919}']
      procedure testProcedure();
   end;

   TMyClass = class(TInterfacedObject, (*IInterface, *)IMyInterface)
      protected var
         shouldSupport: Boolean;
      public
         constructor Create(const shouldSupport: Boolean = True);
         procedure testProcedure();

         function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
   end;

procedure justSupportThings();
var
   instance:      IInterface;
   myIntf:         IMyInterface;
   shouldSupport:   Boolean;
begin
   shouldSupport := False; // Hier anpassen

   instance := TMyClass.Create(shouldSupport);
   if Supports(instance, IMyInterface, myIntf) then begin
      WriteLn('Instance supports interface');
      myIntf.testProcedure();
   end else
      WriteLn('Instance does not support interface');
end;

{ TMyClass }

procedure TMyClass.testProcedure();
begin
   WriteLn('This is the test procedure');
end;

constructor TMyClass.Create(const shouldSupport: Boolean);
begin
   inherited Create();
   self.shouldSupport := shouldSupport;
end;

function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
   if (not shouldSupport) then Exit(E_NOINTERFACE) else Result := inherited;
end;

begin
  try
   justSupportThings();
  except
    on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
  Mit Zitat antworten Zitat
Muzel

Registriert seit: 6. Mai 2011
3 Beiträge
 
#9

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 2. Jul 2015, 10:05
Mein Code ist im Wesentlichen so wie in dem Beispiel. IInterface ist in der Vorgängerklasse schon drin, deshalb macht es keinen Unterschied, wenn ich es nochmal angebe.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.364 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Interface nur unter bestimmten Bedingungen unterstützen

  Alt 2. Jul 2015, 15:47
deshalb macht es keinen Unterschied
Nö.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf