Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
Przeglądarka wywołuje funkcję MkParseDisplayName, przekazując adres URL łącza.
MkParseDisplayName analizuje adres URL, tworzy odpowiadający mu asynchroniczny moniker i zwraca wskaźnik do interfejsu IMoniker.
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.
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:
- Moniker adresu URL wywołuje IPersistMoniker::Load, przekazując własny wskaźnik IMoniker do obiektu.
- 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.
- 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.
- 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.
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:
- 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.
- 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.
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ł.
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.