Поделиться через


Добавление поддержки формата изображений

Мини-накопитель WIA передает форматы изображений в службу WIA в методе IWiaMiniDrv::d rvGetWiaFormatInfo .

Реализация IWiaMiniDrv::d rvGetWiaFormatInfo

Служба WIA вызывает метод IWiaMiniDrv::d rvGetWiaFormatInfo для получения пар TYMED и FORMAT, поддерживаемых устройством WIA.

Драйвер WIA должен выделить память (для хранения в этом драйвере WIA и освобожденной этим драйвером WIA) для хранения массива WIA_FORMAT_INFO структур (описано в документации по Microsoft Windows SDK). В ppwfi должен быть передан указатель на память, выделенную драйвером WIA. Это делается не напрямую, а с помощью указателя на указатель. В следующем примере ppwfi задается с адресом m_WIAFormatInfo[0], который, в свою очередь, вычисляется как адрес первого члена структуры.

Важно отметить, что служба WIA не освобождает эту память. За управление выделенной памятью отвечает драйвер WIA.

Драйвер WIA должен записать количество структур, выделенных в расположении памяти, на которое указывает параметр pcelt .

Устройство WIA должно задать для элемента guidFormatID структуры WIA_FORMAT_INFO GUID формата изображения. Устройство должно задать элементу lTymed этой структуры значение TYMED, связанное с GUID формата изображения:

Допустимые значения TYMED (также известные как тип носителя):

TYMED_FILE

TYMED_MULTIPAGE_FILE

TYMED_CALLBACK

TYMED_MULTIPAGE_CALLBACK

В следующем примере показана реализация 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;
}