Partager via


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;
}