Добавление поддержки формата изображений
Мини-накопитель 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;
}