Wenn die Interfaces mit
GraphBuilder.QueryInterface(IID_I*, *);
verbunden werden, werden Pointer gesetzt, auch wenn die Interfaces nicht genutzt werden können. So ergibt die Abfrage
Delphi-Quellcode:
// Kann die autstärke und Ballance geändert werden?
if Assigned(BasicAudio) then
auch True, wenn kein Audio vorhanden ist. Dasselbe gilt für
Delphi-Quellcode:
// Hat die Datei ein VideoStream?
if Assigned(VideoWindow) then
Deshalb sollte jeweils eine weitere Abfrage erfolgen. Zum Beispiel
Delphi-Quellcode:
function IsAudio: Boolean;
var
Int : Integer;
begin
{
* HRESULT get_Volume(
* [out] long *plVolume Pointer to a variable that receives the volume.
* );
}
Result := Assigned(FBasicAudio) and
not(Failed(FBasicAudio.get_Volume(Int)));
{
* Results:
* E_NOTIMPL The filter graph does not contain an audio renderer filter.
* (Possibly the source does not contain an audio stream.)
* E_POINTER Null pointer argument.
* S_OK Success.
}
end;
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Delphi-Quellcode:
function IsVideo: Boolean;
var
vis : longBool;
begin
{
* HRESULT get_Visible(
* [out] long *pVisible Pointer to a variable that receives the
* value OATRUE if the window is visible, or
* OAFALSE if the window is hidden.
* );
}
Result := Assigned(FBasicVideo) and
Assigned(FVideoWindow) and
not(Failed(FVideoWindow.get_Visible(vis)));;
{
* FBasicVideo ist auch verbunden, wenn kein Video vorhanden ist. Deshalb wird
* der Zustand des VideoWindow abgefragt. Die Abfrage ergibt nur Wahr, wenn
* Video vorhanden ist.
*
* Results:
* E_POINTER NULL pointer.
* S_OK Success.
* VFW_E_NOT_CONNECTED The video renderer filter is not connected.
}
end;
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx