应用程序如何释放 WIA 设备

如果应用程序不再需要 WIA 设备,它将调用 Microsoft Windows SDK 文档) 中所述的 IWiaItem::Release 方法 (。 释放对任何 WIA 项的最后一次引用时,WIA 服务将调用 IWiaMiniDrv::d rvUnInitializeWia 方法。 WIA 微型驱动程序应主要使用此方法来管理与所有已连接应用程序关联的资源。 应用程序关闭时,不再需要与其项树关联的资源。 WIA 微型驱动程序应通过递增 IWiaMiniDrv::d rvInitializeWia 中的引用计数器并递减 IWiaMiniDrv::d rvUnInitializeWia 中的引用计数器来跟踪所有连接的应用程序。 此时释放资源可能会导致其他连接的应用程序出现问题。 当引用计数器达到零时,没有更多应用程序连接到 WIA 微型驱动程序。 微型驱动程序应清理在应用程序连接期间获取的任何已分配资源。

注意 **** IWiaMiniDrv::d rvUnInitializeWia 方法不卸载驱动程序。 可以再次调用驱动程序来处理事件,或者当应用程序要与其通信时。 调用此方法并不意味着所有客户端都断开连接。 每次客户端断开连接应有一次调用。 每次对 IWiaMiniDrv::d rvUnInitializeWia 方法的调用都应与 对 IWiaMiniDrv::d rvInitializeWia 方法的相应调用配对。

WIA 驱动程序 不应 释放此方法调用中的任何驱动程序资源,除非它可以安全地确定当前 未连接任何 应用程序。

若要确定当前应用程序连接计数,WIA 驱动程序应递增类成员变量作为引用计数器,以跟踪对 IWiaMiniDrv::d rvInitializeWia 的方法调用, (递增计数器) 和 IWiaMiniDrv::d rvUnInitializeWia (递减计数器) 。

以下示例演示 IWiaMiniDrv::d rvUnInitializeWia 方法的实现。

HRESULT _stdcall CWIADevice::drvUnInitializeWia(BYTE *pWiasContext)
{
  //
  // If the caller did not pass in the correct parameters,
  // then fail the call with E_INVALIDARG.
  //

  if (!pWiasContext) {
      return E_INVALIDARG;
  }

  InterlockedDecrement(&m_lClientsConnected);

  //
  // make sure we never decrement below zero (0)
  //

  if(m_lClientsConnected < 0){
      m_lClientsConnected = 0;
  return S_OK;
  }

  //
  // check for connected applications.
  //

  if(m_lClientsConnected == 0){

      //
      // There are no application clients connected to this WIA driver
      //

  }

  return S_OK;
}