異步記憶體可增強 COM 結構化儲存規格,以支援在因特網等高延遲、緩慢鏈接的網路上下載儲存物件。 異步儲存會與異步名稱物件一起運作,以提供完整的異步綁定行為。
內嵌在網頁中的文件物件
當使用者點擊網頁中嵌入文件的連結時,會發生下列事件:
瀏覽器會呼叫 MkParseDisplayName 函式,並傳遞連結 URL。
MkParseDisplayName 解析 URL,建立相應的異步 Moniker,並返回 moniker 的 IMoniker 介面的指標。
瀏覽器會呼叫 IsAsyncMoniker,以判斷 moniker 是否為異步。如果 moniker 為異步,則建立系結內容,並在系結內容中註冊 IBindStatusCallback 介面,然後呼叫 IMoniker::BindToObject,傳遞系結內容。
Moniker 會系結至物件並查詢其 IPersistMoniker 介面,以判斷該物件是否支援異步系結與儲存。 如果物件傳回 IPersistMoniker 指標:
- URL Moniker 會呼叫 IPersistMoniker::Load,並將它自己的 IMoniker 指標傳遞給物件。
- 物件會修改系結內容,選擇它是否想要封鎖或非封鎖儲存,註冊自己的 IBindStatusCallback,並在透過 IPersistMoniker::Load所收到的指標上呼叫 IMoniker::BindToStorage。
- Moniker 會建立異步記憶體、保留包裝函式物件的 IFillLockBytes 介面的參考、在根記憶體上註冊 IProgressNotify 介面,以及呼叫 IPersistStorage::Load,傳遞異步記憶體的 IStorage 指標。 當數據到達時(在背景線程上),Moniker 會呼叫 IFillLockBytes,以在暫存檔案上填入 ILockBytes。
- 物件會從儲存裝置讀取數據,並在收到足夠的數據以認為自身已完成初始化時,從 IPersistMoniker::Load傳回。 如果對象嘗試讀取尚未下載的數據,下載程式會收到 IProgressNotify通知。 在 IProgressNotify::OnProgress 方法內,下載執行緒會封鎖在模態訊息迴圈中,或讓異步儲存體返回 E_PENDING,這取決於物件是否要求封鎖或非封鎖儲存體。
如果物件未實作 IPersistMoniker,則 moniker 會查詢 IPersistStorage,這表示物件的永續性狀態會儲存在記憶體物件中。 如果物件傳回 IPersistStorage 指標,:
- Moniker 本身會呼叫 IMoniker::BindToStorage,要求封鎖 IStorage(因為物件不是異步感知),會建立異步儲存、保留封裝物件的 IFillLockBytes 介面的參考、註冊根儲存上的 IProgressNotify 介面,以及呼叫 IPersistStorage::Load,傳遞異步儲存 IStorage 指標。 當數據到達(在背景線程上)時,Moniker 會呼叫 IFillLockBytes,以在臨時檔案上填入 ILockBytes。
- 物件會從儲存裝置讀取數據,當接收到足夠的數據以認為自己已初始化時,從 IPersistStorage::Load 回傳。 如果對象嘗試讀取尚未下載的數據,它會收到 IProgressNotify的通知。 在 IProgressNotify::OnProgress 方法內,下載執行緒會封鎖在模態訊息迴圈中。
無論下載是同步還是異步,Moniker 都會從 IMoniker::BindToObject傳回,而瀏覽器會接收其要求的初始化物件。
瀏覽器會查詢 IOleObject,並將該物件裝載為文件物件。 (此時物件可能未完全初始化,但足以顯示有用的內容,在此情況下,下載會繼續在背景中。