Freigeben über


Hinzufügen von Bildformatunterstützung

Ein WIA-Minidriver meldet Bildformate an den WIA-Dienst in der IWiaMiniDrv::d rvGetWiaFormatInfo-Methode .

Implementieren von IWiaMiniDrv::d rvGetWiaFormatInfo

Der WIA-Dienst ruft die IWiaMiniDrv::d rvGetWiaFormatInfo-Methode auf, um die WIA-gerätegestützten TYMED- und FORMAT-Paare abzurufen.

Der WIA-Treiber sollte Arbeitsspeicher zuordnen (der in diesem WIA-Treiber gespeichert und von diesem WIA-Treiber freigegeben werden soll), um ein Array von WIA_FORMAT_INFO Strukturen zu enthalten (in der Microsoft Windows SDK-Dokumentation beschrieben). Ein Zeiger auf den vom WIA-Treiber zugewiesenen Arbeitsspeicher sollte an ppwfi übergeben werden. Dies geschieht nicht direkt, sondern mit einem Zeiger auf einen Zeiger. Im folgenden Beispiel wird ppwfi mit der Adresse von m_WIAFormatInfo[0] festgelegt, die wiederum auf die Adresse des ersten Elements der Struktur ausgewertet wird.

Es ist wichtig zu beachten, dass der WIA-Dienst diesen Arbeitsspeicher nicht freigibt. Es liegt in der Verantwortung des WIA-Treibers, diesen zugeordneten Arbeitsspeicher zu verwalten.

Der WIA-Treiber sollte die Anzahl der Strukturen schreiben, die am Speicherort des Arbeitsspeichers zugeordnet sind, auf den der pcelt-Parameter verweist.

Das WIA-Gerät sollte das guidFormatID-Element der WIA_FORMAT_INFO-Struktur auf die Bildformat-GUID festlegen. Das Gerät sollte den lTymed-Member dieser Struktur auf den TYMED-Wert festlegen, der der GUID des Bildformats zugeordnet ist:

Gültige TYMED-Werte (auch als "Medientyp" bezeichnet) sind:

TYMED_FILE

TYMED_MULTIPAGE_FILE

TYMED_CALLBACK

TYMED_MULTIPAGE_CALLBACK

Das folgende Beispiel zeigt eine Implementierung von 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;
}