Zitat:
Fraglich ist ja nur, welchen Sinn Supports( _IWmpEffects, IID_IWMPEffects2, ObjInstance ); haben kann. Mit ObjInstance habe ich ja nur die Möglichkeit auf IUnknown zuzugreifen und müsste schon wieder mit Supports prüfen/casten.
Ja der sinn ist halt dieser das ich dann nach dem casten das IWmpEffects löschen kann da nicht mehr gebraucht.
Es gibt aber auch Plugins welche NUR das IWmpEffects verwenden und dann keinen zugriff auf das IWmpEffects2 haben dürfen.
Deshalb muss ich casten.
Mir geht es um den richtigen weg so das ich weis was zugehörig ist und nicht irgend etwas da reinklatsche.
Delphi-Quellcode:
IWMPEffects =
interface(IUnknown)
['
{D3984C13-C3CB-48e2-8BE5-5168340B4F35}']
// Render using the rectangle on the normalized device context
//void Render(ref TimedLevel levels, IntPtr hdc, ref RECT r);
function Render(
var pLevels : TimedLevel; hdc : HDC;
var prc : TRect): HRESULT;
stdcall;
// provides the no. channels, sample rate and title of the audio currently playing
function MediaInfo(lChannelCount : longint; lSampleRate : longint; bstrTitle : WideString): HRESULT;
stdcall;
// called to retrieive the capabilities of the effect (fullscreen? property page?, etc.)
function GetCapabilities(
var pdwCapabilities : longint): HRESULT;
stdcall;
// retrieve the display title of the effect
function GetTitle(
var bstrTitle : WideString): HRESULT;
stdcall;
// retrieve the title for a preset
function GetPresetTitle(nPreset : LongInt;
var bstrPresetTitle : WideString): HRESULT;
stdcall;
// retrieve the number of presets this effect supports
function GetPresetCount(
var pnPresetCount : LongInt): HRESULT;
stdcall;
// set / get the current preset
function SetCurrentPreset(nPreset : LongInt): HRESULT;
stdcall;
function GetCurrentPreset(
var pnPreset : LongInt): HRESULT;
stdcall;
// display the property page of the effect (if there is one)
function DisplayPropertyPage(hwndOwner : HWND): HRESULT;
stdcall;
// This method will be called when the effect is to start and stop full screen
// rendering (if supported)
function GoFullscreen(fFullScreen : BOOL): HRESULT;
stdcall;
// This method will get called after a successful call to GoFullScreen to render
// the effect. Return failure from this method to signal loss of full screen.
function RenderFullScreen(
var pLevels : TimedLevel): HRESULT;
stdcall;
end;
IWMPEffects2 =
interface(IWMPEffects)
['
{695386EC-AA3C-4618-A5E1-DD9A8B987632}']
// Called by Windows Media Player to provide visualization access to the
// core Windows Media Player APIs.
function SetCore(
var pPlayer : IWMPCore): HRESULT;
stdcall;
// Called by Windows Media Player to instantiate a visualization window
function Create(hwndParent : HWND): HRESULT;
stdcall;
// Called by Windows Media Player to destroy a visualization window
// instantiated in the Create method.
function Destroy: HRESULT;
stdcall;
//Called by Windows Media Player to inform the visualization that a new
//media item has been loaded.
function NotifyNewMedia(
var pMedia : IWMPMedia): HRESULT;
stdcall;
// Called by Windows Media Player to pass window messages to a visualization.
function OnWindowMessage(msg : UINT; WParam : WPARAM; LParam : LPARAM;
var plResultParam : LRESULT): HRESULT;
stdcall;
// Called by Windows Media Player to render a windowed visualization.
function RenderWindowed(
var pData : TimedLevel; fRequiredRender : BOOL): HRESULT;
stdcall;
end;
Mit dem IWmpEffects2 kann ich dann alle Funktionen des IWmpEffects verwenden aber nicht umgekehrt.
Habe da wirklich ein Verständnis Probleme.
Die sich dann verständlicherweise auf Fehler auswirken.
Zitat:
Und bei Kleinerem bekommt man eventuelle Zugriffsverletzungen
Und damit habe ich zu kämpfen da ich nicht weis ob der Zeiger auf das Interface zugehörig ist zum aktuellen Plugin.
Wenn da so ein Kuddelmuddel ist.
Ich glaube wenn ich da irgend etwas einfügen kann und zugriff auf das IWmpEffects2 Interface bekomme ist das sehr kritisch.
Zitat:
Aber function Supports<I: IInterface>(var Intf: I): Boolean; müsste auch funktionieren.
Keine Ahnung ob D2010 das Unterstützt.
gruss