次の方法で共有


非同期バインディングとストレージのしくみ

非同期ストレージでは、COM 構造化ストレージ仕様が強化され、インターネットなどの待機時間の長い低速リンク ネットワークでのストレージ オブジェクトのダウンロードがサポートされます。 非同期ストレージは非同期モニカーと連携して、完全な非同期バインディング動作を提供します。

Web ページに埋め込まれたドキュメント オブジェクト

ユーザーが Web ページに埋め込まれたドキュメントを表すリンクをクリックすると、次のイベントが発生します。

  1. ブラウザーは MkParseDisplayName 関数を呼び出し、リンク URL を渡します。

  2. MkParseDisplayName は URL を解析し、対応する非同期モニカーを作成し、モニカーの IMoniker インターフェイスへのポインターを返します。

  3. ブラウザーは IsAsyncMoniker を呼び出して、モニカーが非同期であるかどうかを判断し、バインド コンテキストを作成し、 IBindStatusCallback インターフェイスをバインド コンテキストに登録します。モニカーが非同期の場合にのみ、バインド コンテキストを渡して IMoniker::BindToObject を呼び出します。

  4. モニカーは オブジェクトにバインドし、 IPersistMoniker インターフェイスに対してクエリを実行します。これは、オブジェクトが非同期バインディングとストレージをサポートしているかどうかを示します。 オブジェクトが IPersistMoniker へのポインターを返す場合:

    1. URL モニカーは IPersistMoniker::Load を呼び出し、独自の IMoniker ポインターを オブジェクトに渡します。
    2. オブジェクトはバインド コンテキストを変更し、ブロッキング ストレージと非ブロッキング ストレージのどちらを使用するかを選択し、独自の IBindStatusCallback を登録し、IPersistMoniker::Load を介して受信したポインターで IMoniker::BindToStorage を呼び出します。
    3. モニカーは非同期ストレージを作成し、ラッパー オブジェクトの IFillLockBytes インターフェイスへの参照を保持し、ルート ストレージに IProgressNotify インターフェイスを登録し、 IPersistStorage::Load を呼び出して、非同期ストレージの IStorage ポインターを 渡します。 データが (バックグラウンド スレッドで) 到着すると、モニカー は IFillLockBytes を呼び出して、一時ファイルの ILockBytes を埋めます。
    4. オブジェクトは、ストレージからデータを読み取り、 IPersistMoniker::Load から返します。これは、自身の初期化を考慮するのに十分なデータを受信した場合です。 オブジェクトがまだダウンロードされていないデータの読み取りを試みると、ダウンローダーは IProgressNotify で通知を受け取ります。 IProgressNotify::OnProgress メソッド内では、ダウンロード スレッドはモーダル メッセージ ループでブロックするか、オブジェクトがブロックまたは非ブロッキング ストレージを要求したかどうかに応じて、非同期ストレージからE_PENDINGを返します。
  5. オブジェクトが IPersistMoniker を実装していない場合、モニカーは IPersistStorage を照会します。これは、オブジェクトの永続的な状態がストレージ オブジェクトに格納されていることを示します。 オブジェクトが IPersistStorage へのポインターを返す場合:

    1. モニカーは IMoniker::BindToStorage をそれ自体で呼び出し、ブロック IStorage を要求し (オブジェクトが非同期対応でないため)、非同期ストレージを作成し、ラッパー オブジェクトの IFillLockBytes インターフェイスへの参照を保持し、ルート ストレージに IProgressNotify インターフェイスを登録し、 IPersistStorage::Load を呼び出して、非同期ストレージの IStorage ポインターを 渡します。 データが (バックグラウンド スレッドで) 到着すると、モニカーは IFillLockBytes を呼び出して、一時ファイルの ILockBytes を埋めます。
    2. オブジェクトは、ストレージからデータを読み取り、 IPersistStorage::Load から返します。これは、自身が初期化されたと見なす十分なデータを受信した場合です。 オブジェクトがまだダウンロードされていないデータの読み取りを試みると、 IProgressNotify で通知を受け取ります。 IProgressNotify::OnProgress メソッド内では、ダウンロード スレッドは常にモーダル メッセージ ループでブロックします。
  6. ダウンロードが同期か非同期かに関係なく、モニカーは IMoniker::BindToObject から戻り、ブラウザーは要求した初期化されたオブジェクトを受け取ります。

  7. ブラウザーは IOleObject に対してクエリを実行し、オブジェクトを Document オブジェクトとしてホストします。 (この時点で、オブジェクトは完全に初期化されていない可能性がありますが、便利なものを表示するのに十分です。その場合、ダウンロードはバックグラウンドで続行されます)。