共用方式為


WIA 錯誤處理架構

WIA 錯誤處理架構是由三個部分所組成。 作業系統、驅動程式和應用程式。 錯誤處理機制依賴資料流程型資料傳輸。 此傳輸模型適用于 Windows Vista 和更新版本的作業系統。 如果 WIA 驅動程式支援這個新的錯誤處理方法,則必須寫入以使用此傳輸模型。 同樣地,應用程式也必須撰寫以支援以資料流程為基礎的傳輸模型,才能參與這個新的錯誤處理架構。

WIA 錯誤處理是由系統提供、IHV 提供和 ISV 提供的元件所組成。 下圖說明每個元件的供應商。

說明 wia 錯誤處理元件的圖表。

有三個可能的錯誤處理常式:應用程式錯誤處理常式、驅動程式錯誤處理常式和預設錯誤處理常式。 下圖顯示這三個錯誤處理常式。

說明三個錯誤處理常式的圖表。

此影像也會顯示 WIA Proxy 回呼嘗試這三個錯誤處理常式的階層。

在大部分方面,這些處理常式都相同。 不過,有幾個差異。 應用程式錯誤處理常式會實作 IWiaAppErrorHandler 介面,而驅動程式錯誤交握延伸模組和預設錯誤處理常式會實作 IWiaErrorHandler 介面。 應用程式錯誤處理常式也會使用必須在回呼物件中實作的 IWiaTransferCallback

裝置狀態碼會傳遞至錯誤處理常式,其中包含IWiaErrorHandler::ReportStatushrStatus參數。 這個值與IWiaTransferCallback::WiaTransferParams方法的 hrErrorStatus參數中所設定的 minidriver 相同。

如果 hrStatus 參數設定為 SEVERITY_SUCCESS,則表示非嚴重延遲。 這表示錯誤處理 UI 應該只提供無模式、參考對話方塊,以及取消傳輸的機會。 下次錯誤處理常式收到具有不同 hrStatus 值的訊息時,應該關閉 UI, (錯誤處理常式是否支援此訊息) 。

注意 只能同時顯示一個無模式錯誤處理常式對話方塊。

錯誤處理常式應該會顯示強制回應 UI,以回應SEVERITY_ERROR的裝置狀態訊息。

WIA 錯誤處理涉及四個元件:

WIA 迷你驅動程式
minidriver 現在可以使用 Windows Vista 的新功能,WIA_TRANSFER_MSG_DEVICE_STATUS裝置狀態訊息,指出裝置層級發生什麼事。 當驅動程式傳送此訊息時,也必須設定hrErrorStatus (,也可能是IWiaTransferCallback::WiaTransferParams方法的lPercentComplete) 參數。 狀態碼可以是錯誤或參考。 如果是錯誤狀態碼,則需要使用者介入才能從錯誤中復原,前提是錯誤是可復原的。 驅動程式可以將 hrErrorStatus 設定為預先定義的 WIA HRESULT 值,例如WIA_STATUS_WARMING_UP,或建立自己的自訂 HRESULT。

應用程式錯誤處理常式
為了讓應用程式啟用錯誤處理,它必須實作 IWiaAppErrorHandler 介面。 此介面是由應用程式回呼物件所實作,其傳遞至 IWiaTransfer::D ownloadIWiaTransfer::Upload 方法。 實作 IWiaTransferCallback 介面需要這個回呼物件。 藉由實作 IWiaAppErrorHandler,應用程式會指出它允許在資料傳輸期間叫用錯誤處理常式。

驅動程式的錯誤處理常式
驅動程式的錯誤處理常式是必須實作 IWiaErrorHandler 介面的驅動程式延伸模組。 錯誤處理常式可以處理及顯示任何狀態碼的 UI;這些狀態碼包括 WIA 定義的狀態碼,以及驅動程式特有的狀態碼。

預設錯誤處理常式
預設錯誤處理常式是由 WIA 實作。 它會處理並顯示一些一般裝置狀態訊息的 UI。 這些訊息可以是參考和錯誤,例如:WIA_ERROR_PAPER_JAM和WIA_STATUS_WARMING_UP。

WIA Proxy 不會處理錯誤訊息本身。 相反地,WIA Proxy 會提供錯誤處理常式處理裝置狀態訊息的機會。

錯誤處理常式提供 UI,讓使用者嘗試讓系統處於可繼續或取消資料傳輸的狀態。

收到WIA_TRANSFER_MSG_DEVICE_STATUS訊息時,WIA Proxy 會先呼叫應用程式錯誤處理常式的 IWiaAppErrorHandler::ReportStatus 方法。 如果應用程式回呼常式未處理裝置狀態碼,WIA Proxy 會叫用驅動程式錯誤處理常式的 IWiaErrorHandler::ReportStatus 實作,最後 WIA Proxy 會叫用預設錯誤處理常式的 IWiaErrorHandler::ReportStatus 實作 。 例如,如果指定的處理常式不存在 (,則驅動程式可能沒有) 錯誤處理延伸模組,或如果驅動程式的裝置狀態處理常式傳回WIA_STATUS_NOT_HANDLED,表示驅動程式的處理常式不支援裝置程式碼,鏈結中的下一個處理常式將有機會。 一旦處理裝置狀態訊息,成功或失敗,WIA Proxy 回呼就會傳回。 因此,如果驅動程式錯誤處理常式的 ReportStatus 方法針對每個訊息傳回S_OK,則預設錯誤處理常式永遠不會有機會處理任何裝置狀態訊息。

如果沒有錯誤處理常式支援SEVERITY_ERROR (錯誤訊息) 的裝置狀態訊息,WIA Proxy 會將狀態錯誤傳回驅動程式,進而停止傳輸。 驅動程式應該從 IWiaMiniDrv::d rvAcquireItemData 傳回此 HRESULT 值,而應用程式將從 IWiaTransfer::D ownloadIWiaTransfer::Upload接收此 HRESULT。

如果沒有錯誤處理常式處理具有SEVERITY_SUCCESS (參考訊息) 的裝置狀態訊息,WIA Proxy 會將S_OK傳回給驅動程式。

注意 應用程式的回呼常式 IWiaTransferCallback::TransferCallback永遠不會收到 lMessage 設定為WIA_TRANSFER_MSG_DEVICE_STATUS的訊息。 相反地,這些訊息會傳送至錯誤處理常式。

Microsoft Windows SDK檔中說明IWiaTransferCallbackIWiaAppErrorHandlerIWiaTransfer介面。