Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Wie unterscheiden ? (https://www.delphipraxis.net/92896-wie-unterscheiden.html)

EWeiss 28. Mai 2007 14:25


Wie unterscheiden ?
 
Hallo

Wie kann ich unterscheiden ohne einen AV zu provozieren
ob ein Interface die gleiche eigenschaft wie das andere unterstützt ?

Das Problem liegt hier!

1. Interface
Delphi-Quellcode:
IWMPEffects = interface(IUnknown)
2. Interface
Delphi-Quellcode:
IWMPEffects2 = interface(IWMPEffects)
das zweite erbt auch eigenschaften des ersten Interface
das erste aber noch lange nicht die des zweiten.

Hier liegt mein Problem das zu vergleichen ohne einen AV zu bekommen.

gruss Emil

Apollonius 28. Mai 2007 14:30

Re: Wie unterscheiden ?
 
Wenn du ein IWMPEffects hast, und du willst wissen, ob es auch ein IWMPEffects2 ist, dann kannst du das einfach mit
Delphi-Quellcode:
if Variable is IWMPEffects2 then
prüfen. Ich hoffe, ich habe dich richtig verstanden.

xaromz 28. Mai 2007 14:40

Re: Wie unterscheiden ?
 
Hallo,

dir saubere Lösung ist es, mittels MSDN-Library durchsuchenQueryInterface zu über prüfen, ob ein Interface ein anderes enthält. Dafür kannst Du die Funktion Delphi-Referenz durchsuchenSupports aus den SysUtils nehmen. Dazu benötigt natürlich jedes Interface eine GUID (übrigens auch bei Verwendung von is).

Gruß
xaromz

EWeiss 28. Mai 2007 14:43

Re: Wie unterscheiden ?
 
Zitat:

Zitat von Apollonius
Wenn du ein IWMPEffects hast, und du willst wissen, ob es auch ein IWMPEffects2 ist, dann kannst du das einfach mit
Delphi-Quellcode:
if Variable is IWMPEffects2 then
prüfen. Ich hoffe, ich habe dich richtig verstanden.

Kann nicht ganz folgen.

Das Problem nochmal genauer geschildert.

Ich registriere das Com Object
Delphi-Quellcode:
comObjType := CreateComObject(sCLSID) as IWMPEffects;
comObjType2 := CreateComObject(sCLSID) as IWMPEffects2;
wenn ich nun vergleiche!
Delphi-Quellcode:
if (comObjType <> nil) or (comObjType2 <> nil) then
Bekomme ich einen AV wenn IWMPEffects2 die Methode von IWMPEffects nicht unterstützt.

IWMPEffects2 erbt aber doch die eigenschaften von IWMPEffects
daher ist mir das unverständlich.

WMP9 Plugins unterstützen nicht die eigenschaft 'RenderWindowed' vom IWMPEffects2

EDIT:

Wie kann ich beide Interface als 1 object definieren
um doppelte deklarationen zu vermeiden?

gruss Emil

shmia 29. Mai 2007 11:00

Re: Wie unterscheiden ?
 
Delphi-Quellcode:
comObjType := CreateComObject(sCLSID) as IWMPEffects;
comObjType2 := CreateComObject(sCLSID) as IWMPEffects2;
Das wären ja 2 unabhängige Objekte. So macht das aber keinen Sinn.
Eher so:
Delphi-Quellcode:
var
  ef : IWMPEffects;
  ef2 : IWMPEffects2;
begin
ef := CreateComObject(sCLSID) as IWMPEffects;
// hier erst mal der ganze Code, der nur mit Methoden von IWMPEffects auskommt
ef.IrgendeinProperty := ...
ef.Machirgendwas;

// Mal schauen, ob das neuere Interface IWMPEffects2 unterstützt wird
if Supports(ef, IWMPEffects2, ef2) then
begin
   // Hurra, das neuere, bessere Interface wird vom Objekt unterstützt
   // das wollen wir gleich ausnützen
   ef2.RenderWindowed := ...
   
   ef2 := nil; // wir brauchen den Zeiger auf das IWMPEffects2 Interface nicht mehr
end
else
begin
   // Pech, wir müssen mit dem alten Interface auskommen
end;

EWeiss 29. Mai 2007 12:31

Re: Wie unterscheiden ?
 
Hi shmia

Danke werd mir das mal anschauen und den code dementsprechend ändern.
Danke für deine Informationen.

EDIT:

Delphi-Quellcode:
procedure TBassWMPVis.LoadWMPPlugin(sCLSID: TGUID; Index: Integer);
var
  comObjType : IWMPEffects;
  comObjType2 : IWMPEffects2;
  WStrVal    : string;
begin

  _IWmpEffects := nil;
  _IWmpEffects2 := nil;

  try
    comObjType := CreateComObject(sCLSID) as IWMPEffects;
    if (comObjType <> nil)then
    begin
      if Supports(comObjType, IWMPEffects2, comObjType2) then
      begin
        _IWmpEffects2 := comObjType2;
        GetTitle(WStrVal);
        BassWMPVis1.SetPlgDescription(WStrVal);
        SetIsCOMPlugin(true);
        comObjType2 := nil;
        exit;
        end;
      end else
  except
    SetIsCOMPlugin(false);
    exit;
  end;
  begin
    _IWmpEffects := comObjType;
    GetTitle(WStrVal);
    BassWMPVis1.SetPlgDescription(WStrVal);
    SetIsCOMPlugin(true);
  end;
end;
Der unterschied ist jetzt nur das ich keine 2 ComObjecte erstellen muss.
_IWmpEffects , _IWmpEffects2 muss ich aber so wie bisher weiterhin als vergleich
zwischen den Interface funktionen verwenden.

Wie soll ich sonst wissen wann ich IWmpEffects2.create(VisWindowHandle) erstellen kann.
Das ist mein Hauptproblem gewesen dies zu vereinfachen.

So muss ich nun vergleichen was mehr als 'nil' ist.
Und danach die aktionen ausführen.

Auf jedenfall ist diese lösung um einiges besser als die von mir verwendete ;)

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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