繼承應用程式和 Windows Vista 驅動程式之間的資料傳輸
相容性層必須確定驅動程式的影像處理篩選器一律會叫用,而且未明確支援 LocalService 帳戶的繼承應用程式仍能夠執行資料傳輸。 LocalService帳戶適用于 Microsoft Windows XP 和更新版本的作業系統。
至少,舊版驅動程式必須同時公開TYMED_FILE和TYMED_CALLBACK;不過,Windows Vista 驅動程式永遠不會公開TYMED_CALLBACK (或TYMED_MULTIPAGE_CALLBACK) 。 相容性層的傳輸部分可確保繼承應用程式會看到TYMED_CALLBACK,雖然 Windows Vista 驅動程式並未實作它。 TYMED_MULTIPAGE_CALLBACK永遠不會從 Windows Vista 驅動程式公開。
繼承應用程式會看到 Windows Vista 驅動程式公開TYMED_FILE和TYMED_MULTIPAGE_FILE支援的格式。 針對TYMED_CALLBACK,繼承應用程式會看到與驅動程式針對 TYMED_FILE 公開的格式相同,但有一個例外狀況:而不是公開 WiaImgFmt_BMP,相容性層會將 WiaImgFmt_MEMORYBMP 公開至繼承應用程式。 完成此作業的方式是透過對IWiaMiniDrv::d rvGetWiaFormatInfo進行相容性層「攔截」呼叫,並新增所有 Windows Vista 驅動程式的TYMED_FILE格式 (,但TYMED_CALLBACK / 的WiaImgFmt_BMPWiaImgFmt_MEMORYBMP) 除外。 最重要的是,相容性層會在資料傳輸期間建立自己的舊版回呼物件,這會將 Windows Vista 傳送訊息和寫入資料流程的資料轉換成舊版傳輸訊息。
如需 TYMED 常數的詳細資訊,請參閱 瞭解 TYMED。
相容性層會在 WIA COM Proxy 中建立兩個回呼物件:一個用於回呼傳輸,另一個用於檔案傳輸。 WIA COM Proxy 會實作 IWiaTransferCallback 介面。 這個回呼物件會處理資料流程型傳輸與「舊樣式」傳輸之間的轉換。 WIA 相容性層也會起始驅動程式的影像處理篩選器,而我們傳遞相容性層的回呼物件。 因此,影像處理篩選一律會在應用程式的內容中執行,就像 Windows Vista 傳輸一樣。
下圖說明相容性層如何搭配 Windows Vista 驅動程式和繼承應用程式使用。
WIA COM Proxy 中的舊版回呼物件會將寫入資料流程的 Windows Vista 傳輸訊息和資料轉換成舊版傳輸訊息,並將資料寫入檔案或帶狀資料回呼。
當驅動程式呼叫 IStream 介面所公開的任何方法時,它會從 IWiaMiniDrvTransferCallback::GetNextStream 方法 (請注意,驅動程式應該只會呼叫 IStream::Write、 IStream::Seek和 IStream::SetSize) 。 因此,相容性層會建立自訂 的 IStream 實作,只包裝 WIA COM Proxy 提供的 IStream 介面。
舊版檔案傳輸很簡單。 這類傳輸的範例是繼承應用程式呼叫 IWiaDataTransfer::idtGetData時。 相容性層會在應用程式在 STGMEDIUM 結構中指定的檔案上建立資料流程。 此資料流程會在呼叫 IWiaTransferCallback::GetNextStream 時傳遞至驅動程式或影像處理篩選準則,而且所有傳輸訊息都可以輕鬆地對應至舊版傳輸訊息。 如需訊息對應方式的詳細描述,請參閱 WIA 相容性層資料傳輸實作。
呼叫 IWiaDataTransfer::d tGetData 方法時,相容性層會執行更嚴格的參數檢查。 例如,相容性層不允許呼叫具有 TYMED_FILE的IWiaDataTrasnfer::idtGetData方法,而頁面計數較高,然後有一個使用相容性層的資料傳輸中,可以呼叫具有 TYMED_FILE 的IWiaDataTrasnfer::idtGetData方法,並將頁面計數大於一個。
舊版回呼傳輸有點棘手。 因為 Windows Vista 驅動程式不支援舊版驅動程式所需的 WiaImgFmt_MEMORYBMP,所以相容性層的回呼物件必須處理從 WiaImgFmt_BMP 轉換成 WiaImgFmt_MEMORYBMP。 傳輸訊息之間的對應也並不簡單。 相容性層會建立自己的資料流程實作。 相容性層會在應用程式呼叫 IStream::Write 方法時,將IT_MSG_DATA訊息傳送至應用程式的回呼。
必須在實作相容性層時變更 IWiaTransfer 介面; IWiaTransfer::EnumWIA_FORMAT_INFO 函式會新增至 IWiaTransfer ,以允許TYMED_MULTIPAGE_FILE傳輸。 這個新增不是相容性層的結果,但是必要的,因為無法從 IWiaTransfer 介面或IWiaItem2介面到IWiaItem介面取得IWiaDataTransfer介面。
Microsoft Windows SDK檔中討論IWiaDataTransfer、IWiaTransfer、IWiaItem、IWiaItem2和IStream介面和 STGMEDIUM 結構。