次の方法で共有


イメージ形式のサポートを追加する

WIA ミニドライバーは IWiaMiniDrv::drvGetWiaFormatInfo メソッドの WIA サービスにイメージ形式を報告します。

IWiaMiniDrv::drvGetWiaFormatInfo を実装する

WIA サービスは IWiaMiniDrv::drvGetWiaFormatInfo メソッドを呼び出して、WIA デバイスでサポートされている TYMED と FORMAT のペアを取得します。

WIA ドライバーは、(この WIA ドライバーに格納され、この WIA ドライバーによって解放される) メモリを割り当てて、WIA_FORMAT_INFO 構造体の配列を格納する必要があります (Microsoft Windows SDK のドキュメントで説明)。 WIA ドライバーによって割り当てられたメモリへのポインターを ppwfi に渡す必要があります。 これは直接ではなく、ポインターへのポインターを使用して行われます。 次の例では、 ppwfi は m_WIAFormatInfo[0] のアドレスで設定され、そのアドレスは構造体の最初のメンバーのアドレスに評価されます。

WIA サービスによってこのメモリが解放されない点に注意することが重要です。 この割り当てられたメモリを管理するのは WIA ドライバーの責任です。

WIA ドライバーは pcelt パラメーターが指すメモリ位置に割り当てられている構造体の数を書き込む必要があります。

WIA デバイスは、WIA_FORMAT_INFO 構造体の guidFormatID メンバーをイメージ形式の GUID に設定する必要があります。 デバイスは、この構造体の lTymed メンバーを、イメージ形式 GUID に関連付けられている TYMED 値に設定する必要があります。

有効な TYMED 値 ("メディアの種類" とも呼ばれます) は次のとおりです。

TYMED_FILE

TYMED_MULTIPAGE_FILE

TYMED_CALLBACK

TYMED_MULTIPAGE_CALLBACK

次の例は IWiaMiniDrv::drvGetWiaFormatInfo の実装を示しています。

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;
}