Condividi tramite


Aggiungere il supporto per il formato immagine

Un minidriver WIA segnala i formati di immagine al servizio WIA nel metodo IWiaMiniDrv::d rvGetWiaFormatInfo .

Implementare IWiaMiniDrv::d rvGetWiaFormatInfo

Il servizio WIA chiama il metodo IWiaMiniDrv::d rvGetWiaFormatInfo per ottenere le coppie TYMED e FORMAT supportate dal dispositivo WIA.

Il driver WIA deve allocare memoria (da archiviare in questo driver WIA e liberato da questo driver WIA) per contenere una matrice di strutture WIA_FORMAT_INFO (descritte nella documentazione di Microsoft Windows SDK). Un puntatore alla memoria allocata dal driver WIA deve essere passata a ppwfi. Questa operazione non viene eseguita direttamente, ma con un puntatore a un puntatore. Nell'esempio seguente ppwfi viene impostato con l'indirizzo di m_WIAFormatInfo[0], che a sua volta restituisce l'indirizzo del primo membro della struttura.

È importante notare che il servizio WIA non libera questa memoria. È responsabilità del driver WIA gestire questa memoria allocata.

Il driver WIA deve scrivere il numero di strutture allocate nella posizione di memoria a cui punta il parametro pcelt .

Il dispositivo WIA deve impostare il membro guidFormatID della struttura WIA_FORMAT_INFO sul GUID del formato immagine. Il dispositivo deve impostare il membro lTymed di questa struttura sul valore TYMED associato al GUID del formato immagine:

I valori TYMED validi (noti anche come "Tipo di supporto") sono:

TYMED_FILE

TYMED_MULTIPAGE_FILE

TYMED_CALLBACK

TYMED_MULTIPAGE_CALLBACK

Nell'esempio seguente viene illustrata un'implementazione di 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;
}