![]() |
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:
2. Interface
IWMPEffects = interface(IUnknown)
Delphi-Quellcode:
das zweite erbt auch eigenschaften des ersten Interface
IWMPEffects2 = interface(IWMPEffects)
das erste aber noch lange nicht die des zweiten. Hier liegt mein Problem das zu vergleichen ohne einen AV zu bekommen. gruss Emil |
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:
prüfen. Ich hoffe, ich habe dich richtig verstanden.
if Variable is IWMPEffects2 then
|
Re: Wie unterscheiden ?
Hallo,
dir saubere Lösung ist es, mittels ![]() ![]() Gruß xaromz |
Re: Wie unterscheiden ?
Zitat:
Das Problem nochmal genauer geschildert. Ich registriere das Com Object
Delphi-Quellcode:
wenn ich nun vergleiche!
comObjType := CreateComObject(sCLSID) as IWMPEffects;
comObjType2 := CreateComObject(sCLSID) as IWMPEffects2;
Delphi-Quellcode:
Bekomme ich einen AV wenn IWMPEffects2 die Methode von IWMPEffects nicht unterstützt.
if (comObjType <> nil) or (comObjType2 <> nil) then
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 |
Re: Wie unterscheiden ?
Delphi-Quellcode:
Das wären ja 2 unabhängige Objekte. So macht das aber keinen Sinn.
comObjType := CreateComObject(sCLSID) as IWMPEffects;
comObjType2 := CreateComObject(sCLSID) as IWMPEffects2; 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; |
Re: Wie unterscheiden ?
Hi shmia
Danke werd mir das mal anschauen und den code dementsprechend ändern. Danke für deine Informationen. EDIT:
Delphi-Quellcode:
Der unterschied ist jetzt nur das ich keine 2 ComObjecte erstellen muss.
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; _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 01:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz