Compartilhar via


Escrevendo propriedades WIA por um driver

Um minidriver WIA pode atualizar qualquer um dos valores atuais de suas propriedades WIA e os valores válidos usando as seguintes funções de serviço WIA:

wiasWriteMultiple
Escreva todos os tipos de propriedade WIA. Essa é uma função geral que permite que um driver WIA escreva qualquer propriedade existente em um item WIA, incluindo propriedades personalizadas. Ela pode ser usada para gravar em várias propriedades por chamada.

wiasWritePropStr
Escreva propriedades WIA que são cadeias de caracteres (tipo VT_BSTR).

wiasWritePropLong
Escreva propriedades WIA que são inteiros de quatro bytes (tipo VT_I4).

wiasWritePropFloat
Escreva propriedades WIA que são números reais de quatro bytes (tipo VT_R4).

wiasWritePropGuid
Escreva propriedades WIA que são GUIDs (tipo VT_CLSID).

wiasWritePropBin
Escreva propriedades WIA que são cadeias de caracteres de bytes não assinados (tipo VT_VECTOR | VT_UI1).

wiasGetChangedValueLong
Obtenha as informações alteradas atuais de propriedades WIA que são inteiros de quatro bytes (tipo VT_I4).

wiasGetChangedValueFloat
Obtenha as informações alteradas atuais de propriedades WIA que são números reais de quatro bytes (tipo VT_R4).

wiasGetChangedValueGuid
Obtenha as informações alteradas atuais de propriedades WIA que são GUIDs (tipo VT_CLSID).

wiasGetChangedValueStr
Obtenha as informações alteradas atuais de propriedades WIA que são cadeias de caracteres (tipo VT_BSTR).

wiasCreatePropContext
Crie um contexto de propriedade WIA, que é usado nas funções de serviço wiasGetChangedValueLong, wiasGetChangedValueFloat, wiasGetChangedValueGuid e wiasGetChangedValueStr.

wiasFreePropContext
Libere a memória de contexto alocada que foi criada por wiasCreatePropContext.

Implementando IWiaMiniDrv::drvValidateItemProperties

O método IWiaMiniDrv::drvValidateItemProperties é chamado quando são feitas alterações nas propriedades WIA de um item. O minidriver WIA não deve apenas verificar se os valores são válidos, mas deve atualizar quaisquer valores válidos que forem alterados.

Se uma propriedade WIA for inválida e o aplicativo não estiver gravando nela, o valor inválido e quaisquer valores dependentes deverão ser alterados para valores válidos, do contrário eles falharão na validação (porque o aplicativo está definindo a propriedade como um valor inválido).

O exemplo a seguir mostra uma implementação do método 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;
}