Udostępnij za pośrednictwem


Jak działa powiązanie asynchroniczne i przechowywanie

Magazyn asynchroniczny zwiększa specyfikację magazynu strukturalnego COM w celu obsługi pobierania obiektów magazynu w sieciach o dużym opóźnieniu, takich jak Internet. Magazyn asynchroniczny współpracuje z asynchronicznymi monikerami, aby zapewnić pełne zachowanie powiązania asynchronicznego.

Obiekt dokumentu osadzony na stronie sieci Web

Gdy użytkownik kliknie link reprezentujący dokument osadzony na stronie sieci Web, wystąpią następujące zdarzenia:

  1. Przeglądarka wywołuje funkcję MkParseDisplayName, przekazując adres URL łącza.

  2. MkParseDisplayName analizuje adres URL, tworzy odpowiadający mu asynchroniczny moniker i zwraca wskaźnik do interfejsu IMoniker.

  3. Przeglądarka wywołuje IsAsyncMoniker, aby określić, czy moniker jest asynchroniczny. Tworzy wtedy kontekst powiązania i rejestruje interfejs IBindStatusCallback z tym kontekstem, ale tylko jeśli moniker jest asynchroniczny. Następnie wywołuje IMoniker::BindToObject, przekazując kontekst powiązania.

  4. Moniker łączy się z obiektem i pyta go o interfejs IPersistMoniker, który wskazuje, czy obiekt obsługuje asynchroniczne powiązanie i przechowywanie. Jeśli obiekt zwraca wskaźnik do IPersistMoniker:

    1. Moniker adresu URL wywołuje IPersistMoniker::Load, przekazując własny wskaźnik IMoniker do obiektu.
    2. Obiekt modyfikuje kontekst powiązania, wybiera, czy chce zablokowane, czy nieblokujące przechowywanie, rejestruje własny IBindStatusCallback i wywołuje IMoniker::BindToStorage na wskaźniku odebranym za pośrednictwem IPersistMoniker::Load.
    3. Moniker tworzy magazyn asynchroniczny, przechowuje odniesienie do interfejsu IFillLockBytes obiektu otoki , rejestruje interfejs IProgressNotify w magazynie głównym i wywołuje metodę IPersistStorage::Load , przekazując wskaźnik IStorage magazynu asynchronicznego . Gdy dane docierają (w wątku w tle), moniker używa IFillLockBytes w celu wypełnienia ILockBytes pliku tymczasowego.
    4. Obiekt odczytuje dane z magazynu i zwraca z IPersistMoniker::Załaduj, gdy otrzyma wystarczające dane, aby uznać się za zainicjowany. Jeśli obiekt próbuje odczytać dane, które nie zostały jeszcze pobrane, program pobierający otrzyma powiadomienie o IProgressNotify. Wewnątrz metody IProgressNotify::OnProgress, wątek pobierania albo blokuje w pętli komunikatów modalnych, albo powoduje, że magazyn asynchroniczny zwraca E_PENDING, w zależności od tego, czy obiekt zażądał magazynu blokującego lub nieblokującego.
  5. Jeśli obiekt nie implementuje IPersistMoniker, moniker wysyła zapytania dotyczące IPersistStorage, co wskazuje, że stan trwały obiektu jest przechowywany w obiekcie przechowywania. Jeśli obiekt zwraca wskaźnik do IPersistStorage:

    1. Moniker wywołuje na siebie IMoniker::BindToStorage, żądając blokującego IStorage (ponieważ obiekt nie jest świadomy asynchroniczności), tworzy asynchroniczne magazynowanie, przechowuje odwołanie do interfejsu IFillLockBytes obiektu wrappera, rejestruje interfejs IProgressNotify w magazynie głównym i wywołuje IPersistStorage::Załaduj, przekazując wskaźnik IStorage magazynu asynchronicznego. Gdy dane docierają (w wątku w tle), moniker wywołuje IFillLockBytes, aby wypełnić ILockBytes pliku tymczasowego.
    2. Obiekt odczytuje dane z magazynu i powraca z IPersistStorage::Load, gdy otrzyma wystarczającą ilość danych, aby uznać się za zainicjowany. Jeśli obiekt próbuje odczytać dane, które nie zostały jeszcze pobrane, otrzyma powiadomienie o IProgressNotify. Wewnątrz metody IProgressNotify::OnProgress, wątek pobierania zawsze blokuje się w pętli komunikatów modalnych.
  6. Niezależnie od tego, czy pobieranie jest synchroniczne, czy asynchroniczne, moniker zwraca z IMoniker::BindToObject, a przeglądarka otrzymuje zainicjowany obiekt, którego zażądał.

  7. Przeglądarka wykonuje zapytania dotyczące IOleObject i hostuje obiekt jako obiekt dokumentu. Na tym etapie obiekt może nie być w pełni zainicjowany, ale w wystarczającym stopniu, aby wyświetlić coś użytecznego, w takim przypadku pobieranie kontynuowane jest w tle.