Création d’une table de fonction virtuelle pour un gestionnaire de flux
[La fonctionnalité associée à cette page, Gestionnaires de fichiers personnalisés et de flux, est une fonctionnalité héritée. Il a été remplacé par la classe MediaStreamSource. La classe MediaStreamSource a été optimisée pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise la classe MediaStreamSource au lieu des gestionnaires de fichiers personnalisés et de flux, dans la mesure du possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
L’exemple suivant (écrit en C) montre comment une application (AVIBall) crée la table de fonctions virtuelles utilisée pour référencer ses services.
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
};
Les gestionnaires de fichiers utilisent une procédure similaire, sauf qu’ils utilisent une définition différente pour la table de fonctions virtuelles.