Partilhar via


Adicionar suporte ao formato de imagem

Um minidriver WIA relata formatos de imagem para o serviço WIA no método IWiaMiniDrv::d rvGetWiaFormatInfo .

Implementar IWiaMiniDrv::d rvGetWiaFormatInfo

O serviço WIA chama o método IWiaMiniDrv::d rvGetWiaFormatInfo para obter os pares TYMED e FORMAT compatíveis com o dispositivo WIA.

O driver WIA deve alocar memória (a ser armazenado neste driver WIA e liberado por esse driver WIA) para conter uma matriz de estruturas de WIA_FORMAT_INFO (descrita na documentação do SDK do Microsoft Windows). Um ponteiro para a memória alocada pelo driver wia deve ser passado para ppwfi. Isso não é feito diretamente, mas com um ponteiro para um ponteiro. No exemplo a seguir, ppwfi é definido com o endereço de m_WIAFormatInfo[0], que, por sua vez, é avaliado como o endereço do primeiro membro da estrutura.

É importante observar que o serviço WIA não liberará essa memória. É responsabilidade do driver WIA gerenciar essa memória alocada.

O driver WIA deve gravar o número de estruturas alocadas no local de memória para o qual o parâmetro pcelt aponta.

O dispositivo WIA deve definir o membro guidFormatID da estrutura WIA_FORMAT_INFO para o GUID de formato de imagem. O dispositivo deve definir o membro lTymed dessa estrutura como o valor TYMED associado ao GUID de formato de imagem:

Os valores TYMED válidos (também conhecidos como "Tipo de Mídia") são:

TYMED_FILE

TYMED_MULTIPAGE_FILE

TYMED_CALLBACK

TYMED_MULTIPAGE_CALLBACK

O exemplo a seguir mostra uma implementação 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;
}