AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie unterscheiden ?

Ein Thema von EWeiss · begonnen am 28. Mai 2007 · letzter Beitrag vom 29. Mai 2007
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Wie unterscheiden ?

  Alt 28. Mai 2007, 14:25
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
IWMPEffects = interface(IUnknown) 2. Interface
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Wie unterscheiden ?

  Alt 28. Mai 2007, 14:30
Wenn du ein IWMPEffects hast, und du willst wissen, ob es auch ein IWMPEffects2 ist, dann kannst du das einfach mit
if Variable is IWMPEffects2 then prüfen. Ich hoffe, ich habe dich richtig verstanden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Wie unterscheiden ?

  Alt 28. Mai 2007, 14:40
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: Wie unterscheiden ?

  Alt 28. Mai 2007, 14:43
Zitat von Apollonius:
Wenn du ein IWMPEffects hast, und du willst wissen, ob es auch ein IWMPEffects2 ist, dann kannst du das einfach mit
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!
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Wie unterscheiden ?

  Alt 29. Mai 2007, 11:00
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;
Andreas
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: Wie unterscheiden ?

  Alt 29. Mai 2007, 12:31
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
  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 17:26 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