Sdílet prostřednictvím


Čtení vlastností položky WIA aplikací

Když aplikace odešle požadavek na čtení vlastností položky WIA, služba WIA volá metodu IWiaMiniDrv::drvReadItemProperties.

Metoda IWiaMiniDrv::d rvReadItemProperties by měla provádět následující úlohy:

  1. Určete, jestli vlastnosti, které se čtou, potřebují aktualizace za běhu. K určení, které vlastnosti WIA jsou čteny, může minidriver WIA použít pole PROPSPEC (definované v dokumentaci k sadě Microsoft Windows SDK). Před zpracováním pole PROPSPEC se doporučuje, aby minidriver WIA určil typ položky. Potřeba procházet pole na každém volání IWiaMiniDrv::drvReadItemProperties se tím snižuje. Pokud v podřízených položkách tohoto zařízení nemáte žádné vlastnosti za běhu, budou zpracovány pouze požadavky na čtení vlastností kořenové položky.

  2. Aktualizujte aktuální hodnotu voláním funkcí služby wiasWriteMultiple nebo wiasWritePropXxx pomocí ID vlastnosti WIA. Tím se aktualizuje sada vlastností WIA uložená v položce ovladače a služba WIA vrátí novou hodnotu do aplikace.

Pokud minidriver WIA neprovádí žádné úpravy vlastností WIA v této funkci, služba WIA automaticky vrátí do aplikace pouze aktuální hodnotu vlastnosti WIA. Tato funkce by se měla používat pouze pro vlastnosti, jako jsou hodiny zařízení nebo vlastnosti WIA, které vyžadují kontroly specifické pro hardware, jako je stav zásobníku dokumentů.

Implementace IWiaMiniDrv::drvReadItemProperties

IWiaMiniDrv::d rvReadItemProperties metoda je volána, když se aplikace pokusí přečíst vlastnosti položky WIA. Služba WIA nejprve upozorní ovladač voláním této metody. Ovladač WIA by měl ověřit správnost vlastnosti, která se čte. Je to vhodné místo pro přístup k hardwaru pro vlastnosti, které vyžadují stav zařízení (například WIA_DPS_DOCUMENT_HANDLING_STATUS nebo WIA_DPA_DEVICE_TIME , pokud vaše zařízení podporuje hodiny).

Je důležité si uvědomit, že ovladač WIA by měl komunikovat s hardwarem pouze ve výjimečných případech. Ovladače WIA, které v tomto procesu příliš komunikují s hardwarem, mohou působit pomalu a líně.

Následující příklad ukazuje implementaci IWiaMiniDrv::d rvReadItemProperties metoda:

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