Partager via


Écriture de propriétés WIA par un pilote

Un minipilote WIA peut mettre à jour n’importe laquelle des valeurs actuelles de ses propriétés WIA et des valeurs valides en utilisant les fonctions de service WIA suivantes :

wiasWriteMultiple
Écrire tous les types de propriétés WIA. Il s’agit d’une fonction générale qui permet à un pilote WIA d’écrire toute propriété existante sur un élément WIA, y compris les propriétés personnalisées. Elle peut être utilisée pour écrire plusieurs propriétés par appel.

wiasWritePropStr
Écrire des propriétés WIA qui sont des chaînes (type VT_BSTR).

wiasWritePropLong
Écrire des propriétés WIA qui sont des entiers de quatre octets (type VT_I4).

wiasWritePropFloat
Écrire des propriétés WIA qui sont des nombres réels de quatre octets (type VT_R4).

wiasWritePropGuid
Écrire des propriétés WIA qui sont des GUID (type VT_CLSID).

wiasWritePropBin
Écrire des propriétés WIA qui sont des chaînes d’octets non signés (type VT_VECTOR | VT_UI1).

wiasGetChangedValueLong
Obtenir les informations actuelles modifiées pour les propriétés WIA qui sont des entiers de quatre octets (type VT_I4).

wiasGetChangedValueFloat
Obtenir les informations actuelles modifiées pour les propriétés WIA qui sont des nombres réels de quatre octets (type VT_R4).

wiasGetChangedValueGuid
Obtenir les informations actuelles modifiées pour les propriétés WIA qui sont des GUID (type VT_CLSID).

wiasGetChangedValueStr
Obtenir les informations actuelles modifiées pour les propriétés WIA qui sont des chaînes (type VT_BSTR).

wiasCreatePropContext
Créer un contexte de propriété WIA, qui est utilisé dans les fonctions de service wiasGetChangedValueLong, wiasGetChangedValueFloat, wiasGetChangedValueGuid et wiasGetChangedValueStr.

wiasFreePropContext
Libérer la mémoire de contexte allouée qui a été créée par wiasCreatePropContext.

Implémentation de IWiaMiniDrv::drvValidateItemProperties

La méthode IWiaMiniDrv::drvValidateItemProperties est appelée lorsque des modifications sont apportées aux propriétés WIA d’un élément. Le minipilote WIA doit non seulement vérifier que les valeurs sont valides, mais il doit aussi mettre à jour toutes les valeurs valides qui changent.

Si une propriété WIA est invalide et que l’application n’y écrit pas, la valeur invalide et toutes les valeurs dépendantes doivent être modifiées en valeurs valides, ou sinon l’évaluation échoue (car l’application définit la propriété sur une valeur invalide).

L’exemple suivant montre une implémentation de la méthode IWiaMiniDrv::drvValidateItemProperties :

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