共用方式為


異步系結和記憶體的運作方式

異步記憶體可增強 COM 結構化儲存規格,以支援在因特網等高延遲、緩慢鏈接的網路上下載儲存物件。 異步儲存會與異步名稱物件一起運作,以提供完整的異步綁定行為。

內嵌在網頁中的文件物件

當使用者點擊網頁中嵌入文件的連結時,會發生下列事件:

  1. 瀏覽器會呼叫 MkParseDisplayName 函式,並傳遞連結 URL。

  2. MkParseDisplayName 解析 URL,建立相應的異步 Moniker,並返回 moniker 的 IMoniker 介面的指標。

  3. 瀏覽器會呼叫 IsAsyncMoniker,以判斷 moniker 是否為異步。如果 moniker 為異步,則建立系結內容,並在系結內容中註冊 IBindStatusCallback 介面,然後呼叫 IMoniker::BindToObject,傳遞系結內容。

  4. Moniker 會系結至物件並查詢其 IPersistMoniker 介面,以判斷該物件是否支援異步系結與儲存。 如果物件傳回 IPersistMoniker 指標

    1. URL Moniker 會呼叫 IPersistMoniker::Load,並將它自己的 IMoniker 指標傳遞給物件。
    2. 物件會修改系結內容,選擇它是否想要封鎖或非封鎖儲存,註冊自己的 IBindStatusCallback,並在透過 IPersistMoniker::Load所收到的指標上呼叫 IMoniker::BindToStorage
    3. Moniker 會建立異步記憶體、保留包裝函式物件的 IFillLockBytes 介面的參考、在根記憶體上註冊 IProgressNotify 介面,以及呼叫 IPersistStorage::Load,傳遞異步記憶體的 IStorage 指標。 當數據到達時(在背景線程上),Moniker 會呼叫 IFillLockBytes,以在暫存檔案上填入 ILockBytes
    4. 物件會從儲存裝置讀取數據,並在收到足夠的數據以認為自身已完成初始化時,從 IPersistMoniker::Load傳回。 如果對象嘗試讀取尚未下載的數據,下載程式會收到 IProgressNotify通知。 在 IProgressNotify::OnProgress 方法內,下載執行緒會封鎖在模態訊息迴圈中,或讓異步儲存體返回 E_PENDING,這取決於物件是否要求封鎖或非封鎖儲存體。
  5. 如果物件未實作 IPersistMoniker,則 moniker 會查詢 IPersistStorage,這表示物件的永續性狀態會儲存在記憶體物件中。 如果物件傳回 IPersistStorage 指標,

    1. Moniker 本身會呼叫 IMoniker::BindToStorage,要求封鎖 IStorage(因為物件不是異步感知),會建立異步儲存、保留封裝物件的 IFillLockBytes 介面的參考、註冊根儲存上的 IProgressNotify 介面,以及呼叫 IPersistStorage::Load,傳遞異步儲存 IStorage 指標。 當數據到達(在背景線程上)時,Moniker 會呼叫 IFillLockBytes,以在臨時檔案上填入 ILockBytes
    2. 物件會從儲存裝置讀取數據,當接收到足夠的數據以認為自己已初始化時,從 IPersistStorage::Load 回傳。 如果對象嘗試讀取尚未下載的數據,它會收到 IProgressNotify的通知。 在 IProgressNotify::OnProgress 方法內,下載執行緒會封鎖在模態訊息迴圈中。
  6. 無論下載是同步還是異步,Moniker 都會從 IMoniker::BindToObject傳回,而瀏覽器會接收其要求的初始化物件。

  7. 瀏覽器會查詢 IOleObject,並將該物件裝載為文件物件。 (此時物件可能未完全初始化,但足以顯示有用的內容,在此情況下,下載會繼續在背景中。