Freigeben über


Schreiben von WIA-Eigenschaften durch einen Treiber

Ein WIA-Minitreiber kann alle aktuellen Werte seiner WIA-Eigenschaften und gültigen Werte mithilfe der folgenden WIA-Dienstfunktionen aktualisieren:

wiasWriteMultiple
Alle WIA-Eigenschaftentypen schreiben. Dies ist eine allgemeine Funktion, mit der ein WIA-Treiber jede beliebige Eigenschaft schreiben kann, die in einem WIA-Element vorhanden ist, einschließlich benutzerdefinierter Eigenschaften. Sie kann dazu verwendet werden, mehrere Eigenschaften pro Aufruf zu schreiben.

wiasWritePropStr
WIA-Eigenschaften schreiben, die Zeichenfolgen sind (Typ VT_BSTR).

wiasWritePropLong
WIA-Eigenschaften schreiben, die vier Byte lange Ganzzahlen sind (Typ VT_I4).

wiasWritePropFloat
WIA-Eigenschaften schreiben, die vier Byte lange reelle Zahlen sind (Typ VT_R4).

wiasWritePropGuid
WIA-Eigenschaften schreiben, die GUIDs sind (Typ VT_CLSID).

wiasWritePropBin
WIA-Eigenschaften schreiben, die Zeichenfolgen von Bytes ohne Vorzeichen sind (Typ VT_VECTOR | VT_UI1).

wiasGetChangedValueLong
Die aktuellen geänderten Informationen für WIA-Eigenschaften abrufen, die vier Byte lange Ganzzahlen sind (Typ VT_I4).

wiasGetChangedValueFloat
Die aktuellen geänderten Informationen für WIA-Eigenschaften abrufen, die vier Byte reele Zahlen sind (Typ VT_R4).

wiasGetChangedValueGuid
Die aktuellen geänderten Informationen für WIA-Eigenschaften abrufen, die GUIDs sind (Typ VT_CLSID).

wiasGetChangedValueStr
Die aktuellen geänderten Informationen für WIA-Eigenschaften abrufen, die Zeichenfolgen sind (Typ VT_BSTR).

wiasCreatePropContext
Einen WIA-Eigenschaftenkontext erstellen, der in den Dienstfunktionen wiasGetChangedValueLong, wiasGetChangedValueFloat, wiasGetChangedValueGuid und wiasGetChangedValueStr verwendet wird.

wiasFreePropContext
Den zugewiesenen Kontextspeicher freigeben, der von wiasCreatePropContext erstellt wurde.

Implementieren von IWiaMiniDrv::d rvValidateItemProperties

Die IWiaMiniDrv::d rvValidateItemProperties-Methode wird aufgerufen, wenn WIA-Eigenschaften eines Elements geändert werden. Der WIA-Minitreiber muss nicht nur überprüfen, ob die Werte gültig sind, sondern alle geänderten gültigen Werte aktualisieren.

Wenn eine WIA-Eigenschaft ungültig ist und die Anwendung nicht in sie schreibt, müssen der ungültige Wert und alle abhängigen Werte in gültige Werte geändert werden. Andernfalls schlägt die Überprüfung fehl (da die Anwendung die Eigenschaft auf einen ungültigen Wert festlegt).

Die folgende Beispiel zeigt eine Implementierung der IWiaMiniDrv::drvValidateItemProperties-Methode.

HRESULT _stdcall CWIADevice::drvValidateItemProperties(
  BYTE           *pWiasContext,
  LONG           lFlags,
  ULONG          nPropSpec,
  const PROPSPEC *pPropSpec,
  LONG           *plDevErrVal)
{
  //
  // If the caller did not pass in the correct parameters,
  //  then fail the call with E_INVALIDARG.
  //

  if (!pWiasContext) {
      return E_INVALIDARG;
  }

  if (!plDevErrVal) {
      return E_INVALIDARG;
  }

  if (!pPropSpec) {
      return E_INVALIDARG;
  }

  HRESULT hr      = S_OK;
  LONG lItemType  = 0;
  WIA_PROPERTY_CONTEXT Context;

  *plDevErrVal = 0;

  //
  // create a WIA property context, to gain access to
  // the WIA application's intended settings.
  //

  hr = wiasCreatePropContext(nPropSpec,
                             (PROPSPEC*)pPropSpec,
                             0,
                             NULL,
                             &Context);
  if(S_OK == hr) {

    //
    // get the current item type to help determine what property set to validate
    //

      hr = wiasGetItemType(pWiasContext, &lItemType);
      if (S_OK == hr) {
          if (lItemType & WiaItemTypeRoot) {

            //
            //  validate root item properties here
            //

        } else {

            //
            // validate item properties here
            //

              WIAS_CHANGED_VALUE_INFO cviDataType;
              memset(&cviDataType,0,sizeof(cviDataType));

            //
            // check to see if the application was updating
            // the WIA_IPA_DATATYPE property
   //

              hr = wiasGetChangedValueLong(pWiasContext,pContext,FALSE,WIA_IPA_DATATYPE,&cviDataType);
              if(S_OK == hr) {
                  if (cviDataType.bChanged) {

                    //
                    // This value was changed, and needs to be checked
                    //
                    // cviDataType.Current.lVal is the current application setting.
                    //

                  } else {

                    //
                    // Nothing has been changed, so leave this property alone.
                    // Let the WIA service function wiasValidateItemProperties
                    // do the rest of the work for you.
                    //

 }
              }
          }

        //
        // free the property context
        //

          wiasFreePropContext(&Context);
      }

    //
    // call WIA service helper when you have finished updating dependent values
    //

    if(S_OK == hr) {

        //
        // call WIA service helper to validate other properties
        //

          hr = wiasValidateItemProperties(pWiasContext, nPropSpec, pPropSpec);
      }
  }
  return hr;
}