Erstellen einer virtuellen Funktionstabelle für einen Streamhandler
[Das feature, das dieser Seite zugeordnet ist, Benutzerdefinierte Datei- und Streamhandler, ist ein Legacyfeature. Sie wurde von der MediaStreamSource-Klasse abgelöst. Die MediaStreamSource-Klasse wurde für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit die MediaStreamSource-Klasse anstelle von benutzerdefinierten Datei- und Streamhandlern verwendet. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Das folgende Beispiel (in C geschrieben) zeigt, wie eine Anwendung (AVIBall) die virtuelle Funktionstabelle erstellt, mit der auf ihre Dienste verwiesen wird.
HRESULT STDMETHODCALLTYPE AVIBallQueryInterface (PAVISTREAM ps,
REFIID riid, LPVOID FAR* ppvObj);
HRESULT STDMETHODCALLTYPE AVIBallCreate (PAVISTREAM ps,
LONG lParam1, LONG lParam2);
ULONG STDMETHODCALLTYPE AVIBallAddRef (PAVISTREAM ps);
ULONG STDMETHODCALLTYPE AVIBallRelease (PAVISTREAM ps);
HRESULT STDMETHODCALLTYPE AVIBallInfo (PAVISTREAM ps,
AVIStreamHeader FAR * psi, LONG lSize);
LONG STDMETHODCALLTYPE AVIBallFindSample (PAVISTREAM ps,
LONG lPos, LONG lFlags);
HRESULT STDMETHODCALLTYPE AVIBallReadFormat (PAVISTREAM ps,
LONG lPos, LPVOID lpFormat, LONG FAR *lpcbFormat);
HRESULT STDMETHODCALLTYPE AVIBallSetFormat (PAVISTREAM ps,
LONG lPos, LPVOID lpFormat, LONG cbFormat);
HRESULT STDMETHODCALLTYPE AVIBallRead (PAVISTREAM ps,
LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer,
LONG FAR * plBytes,LONG FAR * plSamples);
HRESULT STDMETHODCALLTYPE AVIBallWrite (PAVISTREAM ps, LONG lStart,
LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags);
HRESULT STDMETHODCALLTYPE AVIBallDelete (PAVISTREAM ps,
LONG lStart, LONG lSamples);
HRESULT STDMETHODCALLTYPE AVIBallReadData (PAVISTREAM ps,
DWORD fcc, LPVOID lp,LONG FAR *lpcb);
HRESULT STDMETHODCALLTYPE AVIBallWriteData (PAVISTREAM ps,
DWORD fcc, LPVOID lp,LONG cb);
IAVIStreamVtbl AVIBallHandler = {
AVIBallQueryInterface, // Function pointer for ::QueryInterface
AVIBallAddRef, // Function pointer for ::AddRef
AVIBallRelease, // Function pointer for ::Release
AVIBallCreate, // Function pointer for ::Create
AVIBallInfo, // Function pointer for ::Info
AVIBallFindSample, // Function pointer for ::FindSample
AVIBallReadFormat, // Function pointer for ::ReadFormat
AVIBallSetFormat, // Function pointer for ::SetFormat
AVIBallRead, // Function pointer for ::Read
AVIBallWrite, // Function pointer for ::Write
AVIBallDelete, // Function pointer for ::Delete
AVIBallReadData, // Function pointer for ::ReadData
AVIBallWriteData // Function pointer for ::WriteData
};
Dateihandler verwenden eine ähnliche Prozedur, mit der Ausnahme, dass sie eine andere Definition für die virtuelle Funktionstabelle verwenden.