Ajout de la prise en charge du format d’image
Un minidriver WIA signale les formats d’image au service WIA dans la méthode IWiaMiniDrv::d rvGetWiaFormatInfo .
Implémenter IWiaMiniDrv::d rvGetWiaFormatInfo
Le service WIA appelle la méthode IWiaMiniDrv::d rvGetWiaFormatInfo pour obtenir les paires TYMED et FORMAT prises en charge par l’appareil WIA.
Le pilote WIA doit allouer de la mémoire (à stocker dans ce pilote WIA et libérer par ce pilote WIA) pour contenir un tableau de structures WIA_FORMAT_INFO (décrites dans la documentation Microsoft Windows SDK). Un pointeur vers la mémoire allouée par le pilote WIA doit être passé à ppwfi. Cette opération n’est pas effectuée directement, mais avec un pointeur vers un pointeur. Dans l’exemple suivant, ppwfi est défini avec l’adresse de m_WIAFormatInfo[0], qui correspond à son tour à l’adresse du premier membre de la structure.
Il est important de noter que le service WIA ne libère pas cette mémoire. Il incombe au pilote WIA de gérer cette mémoire allouée.
Le pilote WIA doit écrire le nombre de structures allouées à l’emplacement de mémoire vers lequel pointe le paramètre pcelt .
L’appareil WIA doit définir le membre guidFormatID de la structure WIA_FORMAT_INFO sur le GUID de format d’image. L’appareil doit définir le membre lTymed de cette structure sur la valeur TYMED associée au GUID de format d’image :
Les valeurs TYMED valides (également appelées « type de média ») sont les suivantes :
TYMED_FILE
TYMED_MULTIPAGE_FILE
TYMED_CALLBACK
TYMED_MULTIPAGE_CALLBACK
L’exemple suivant montre une implémentation de IWiaMiniDrv::d rvGetWiaFormatInfo :
HRESULT _stdcall CWIADevice::drvGetWiaFormatInfo(
BYTE *pWiasContext,
LONG lFlags,
LONG *pcelt,
WIA_FORMAT_INFO **ppwfi,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if ((!pWiasContext)||(!plDevErrVal)||(!pcelt)||(!ppwfi)) {
return E_INVALIDARG;
}
//
// check if WIA_FORMAT_INFO array has been initialized.
//
// NOTE: m_WIAFormatInfo is a member variable that has been
// defined as WIA_FORMAT_INFO m_WIAFormatInfo[2];
//
//
if (m_WIAFormatInfo[0].lTymed == TYMED_NULL) {
//
// add all supported formats and corresponding TYMED values
// here
//
m_WIAFormatInfo[0].guidFormatID = WiaImgFmt_MEMORYBMP;
m_WIAFormatInfo[0].lTymed = TYMED_CALLBACK;
m_WIAFormatInfo[1].guidFormatID = WiaImgFmt_BMP;
m_WIAFormatInfo[1].lTymed = TYMED_FILE;
}
*plDevErrVal = 0;
*ppwfi = &m_WIAFormatInfo[0];
*pcelt = 2; // number of formats in returned array
return S_OK;
}