为流处理程序创建虚拟函数表
[与此页面关联的功能 (自定义文件和流处理程序)是一项旧功能。 它已被 MediaStreamSource 类取代。 MediaStreamSource 类已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用 MediaStreamSource 类 ,而不是 自定义文件和流处理程序。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
以下示例 (用 C) 编写,演示 (AVIBall) 的应用程序如何创建用于引用其服务的虚拟函数表。
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
};
文件处理程序使用类似的过程,只不过它们对虚拟函数表使用不同的定义。