Compartilhar via


Lendo propriedades de item WIA por um aplicativo

Quando um aplicativo faz uma solicitação para ler as propriedades do item WIA, o serviço WIA chama o método IWiaMiniDrv::d rvReadItemProperties .

O método IWiaMiniDrv::d rvReadItemProperties deve executar as seguintes tarefas:

  1. Determine se as propriedades que estão sendo lidas precisam de atualizações em tempo de execução. Para determinar quais propriedades wia estão sendo lidas, o minidriver WIA pode usar a matriz PROPSPEC (definida na documentação SDK do Microsoft Windows). É recomendável que o minidriver WIA determine o tipo de item antes de processar a matriz PROPSPEC. Isso reduz a necessidade de percorrer a matriz em cada chamada IWiaMiniDrv::d rvReadItemProperties . Se você não tiver propriedades em tempo de execução nos itens filho deste dispositivo, somente as solicitações de leitura de propriedade de item raiz serão processadas.

  2. Atualize o valor atual chamando as funções de serviço wiasWriteMultiple ou wiasWritePropXxx usando a ID da propriedade WIA. Isso atualiza o conjunto de propriedades WIA armazenado no item de driver e o serviço WIA retorna o novo valor para o aplicativo.

Se o minidriver WIA não executar nenhum ajuste em tempo de execução nas propriedades do WIA nessa função, o serviço WIA retornará automaticamente apenas o valor da propriedade WIA atual para o aplicativo. Essa função deve ser usada apenas para propriedades como relógios de dispositivo ou propriedades WIA que exigem verificações específicas de hardware, como status do alimentador de documentos.

Implementando IWiaMiniDrv::d rvReadItemProperties

O método IWiaMiniDrv::d rvReadItemProperties é chamado quando um aplicativo tenta ler as propriedades de um item WIA. O serviço WIA primeiro notifica o driver chamando esse método. O driver WIA deve verificar se a propriedade que está sendo lida está correta. Esse é um bom lugar para acessar o hardware para propriedades que exigem status de dispositivo (como WIA_DPS_DOCUMENT_HANDLING_STATUS ou WIA_DPA_DEVICE_TIME se o dispositivo der suporte a um relógio).

É importante observar que um driver WIA deve se comunicar com o hardware apenas em raras ocasiões. Os drivers WIA que se comunicam demais com hardware nesta chamada parecerão lentos e lentos.

O exemplo a seguir mostra uma implementação do método IWiaMiniDrv::d rvReadItemProperties :

HRESULT _stdcall CWIADevice::drvReadItemProperties(
  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;
  }

  *plDevErrVal = 0;

  LONG lWIAItemType = 0;
  HRESULT hr = wiasGetItemType(pWiasContext,&lWIAItemType);
  if(S_OK == hr) {
    //
    // perform custom operations depending on the type of
    // WIA item that was passed to drvReadItemProperties
    //

      if(lWIAItemType & WiaItemTypeRoot) {
      //
      // If the WIA_DPA_CONNECT_STATUS property ID is in the PROPSPEC
      // array, then read the latest "Connect Status".
      // If it is NOT then do nothing. (skip access to the hardware)
      //
      // NOTE: only read properties contained in the PROPSPEC array
      //     from the hardware that need device updates.
      //     If the property in PROPSPEC does not need to be read
      //     from the hardware, or updated, do nothing. The WIA service
      //     will supply the caller with the current value in the
      //     the WIA property set.
      //

          BOOL bReadLatestConnectStatus = FALSE;

      //
      // traverse the WIA PROPSPEC array, looking for known WIA
      // properties that require run-time updates, or needs to be
      // updated with hardware access.
      //

          for(ULONG ulIndex = 0; ulIndex < nPropSpec; ulIndex++) {

        //
        // look for WIA property IDs that really need hardware
        // access, or run-time adjusting.
        //

              if(pPropSpec[ulIndex].propid == WIA_DPA_CONNECT_STATUS) {
                  bReadLatestConnectStatus = TRUE;
              }
          }

        //
        // The item passed in is a ROOT item
        //

         if(bReadLatestConnectStatus) {

            //
            // WIA_DPA_CONNECT_STATUS should be updated from the
            // hardware
            //

 LONG lConnectStatus = HARDWARE_READ_ConnectStatus();

            //
            // update WIA_DPA_CONNECT_STATUS property value using
            // wiasWritePropLong ().  The pWiasContext passed in
            // already represents the current item to be written to.
            //

              hr = wiasWritePropLong(pWiasContext,WIA_DPA_CONNECT_STATUS,lConnectStatus);
              if(S_OK == hr) {

                //
                // The WIA_DPA_CONNECT_STATUS property was successfully updated
                //

              } else {

                //
                //  wiasWritePropLong() failed to write the WIA 
                //  property.  The WIA_DPA_CONNECT_STATUS
                //  property was NOT updated
                //

              }
          }

      } else {

        //
        // The item passed in is any other child item
        //

      }
  } else {

    //
    // wiasGetItemType() failed to get the current item type
    //
  }

  return hr;
}