비동기 바인딩 및 스토리지 작동 방법
비동기 스토리지는 COM 구조적 스토리지 사양을 향상시켜 인터넷과 같은 대기 시간이 긴 느린 연결 네트워크에서 스토리지 개체의 다운로드를 지원합니다. 비동기 스토리지는 비동기 모니커와 함께 작동하여 완전한 비동기 바인딩 동작을 제공합니다.
웹 페이지에 포함된 문서 개체
사용자가 웹 페이지에 포함된 문서를 나타내는 링크를 클릭하면 다음 이벤트가 발생합니다.
브라우저는 MkParseDisplayName 함수를 호출하여 링크 URL을 전달합니다.
MkParseDisplayName 은 URL을 구문 분석하고, 해당 비동기 모니커를 만들고, 모니커의 IMoniker 인터페이스에 대한 포인터를 반환합니다.
브라우저는 IsAsyncMoniker 를 호출하여 모니커가 비동기인지 확인하고, 바인딩 컨텍스트를 만들고, IBindStatusCallback 인터페이스를 바인딩 컨텍스트에 등록하며, 모니커가 비동기인 경우에만 IMoniker::BindToObject를 호출하여 바인딩 컨텍스트를 전달합니다.
모니커는 개체에 바인딩하고 개체가 비동기 바인딩 및 스토리지를 지원하는지 여부를 나타내는 IPersistMoniker 인터페이스에 대해 쿼리합니다. 개체가 IPersistMoniker에 대한 포인터를 반환하는 경우:
- URL 모니커는 IPersistMoniker::Load를 호출하여 자체 IMoniker 포인터를 개체에 전달합니다.
- 개체는 바인딩 컨텍스트를 수정하고, 차단 또는 차단 해제 스토리지를 원하는지 여부를 선택하고, 자체 IBindStatusCallback을 등록하고, IPersistMoniker::Load를 통해 받은 포인터에서 IMoniker::BindToStorage를 호출합니다.
- 모니커는 비동기 스토리지를 만들고, 래퍼 개체의 IFillLockBytes 인터페이스에 대한 참조를 유지하고, 루트 스토리지에 IProgressNotify 인터페이스를 등록하고, IPersistStorage::Load를 호출하여 비동기 스토리지의 IStorage 포인터를 전달합니다. 데이터가 백그라운드 스레드에 도착하면 모니커는 IFillLockBytes 를 호출하여 임시 파일의 ILockBytes 를 채웁니다.
- 개체는 스토리지에서 데이터를 읽고 IPersistMoniker::Load 에서 반환하며, 초기화된 것으로 간주하기에 충분한 데이터를 수신한 경우 반환됩니다. 개체가 아직 다운로드되지 않은 데이터를 읽으려고 하면 다운로더는 IProgressNotify에 대한 알림을 받습니다. IProgressNotify::OnProgress 메서드 내에서 다운로드 스레드는 모달 메시지 루프에서 차단하거나 개체가 차단 또는 차단 해제 스토리지를 요청했는지 여부에 따라 비동기 스토리지가 E_PENDING 반환하도록 합니다.
개체가 IPersistMoniker를 구현하지 않으면 모니커가 IPersistStorage를 쿼리합니다. 이는 개체의 영구 상태가 스토리지 개체에 저장됨을 나타냅니다. 개체가 IPersistStorage에 대한 포인터를 반환하는 경우:
- 모니커는 자체에서 IMoniker::BindToStorage 를 호출합니다. 차단 IStorage 를 요청하고(개체가 비동기 인식되지 않기 때문에) 비동기 스토리지를 만들고, 래퍼 개체의 IFillLockBytes 인터페이스에 대한 참조를 유지하고, 루트 스토리지에 IProgressNotify 인터페이스를 등록하고, IPersistStorage::Load를 호출하여 비동기 스토리지의 IStorage 포인터를 전달합니다. 데이터가 백그라운드 스레드에 도착하면 모니커는 IFillLockBytes 를 호출하여 임시 파일의 ILockBytes 를 채웁니다.
- 개체는 스토리지에서 데이터를 읽고 IPersistStorage::Load 에서 반환하며, 초기화된 것으로 간주하기에 충분한 데이터를 수신한 경우 반환됩니다. 개체가 아직 다운로드되지 않은 데이터를 읽으려고 하면 IProgressNotify에 대한 알림을 받습니다. IProgressNotify::OnProgress 메서드 내에서 다운로드 스레드는 항상 모달 메시지 루프에서 차단됩니다.
다운로드가 동기 또는 비동기인지에 관계없이 모니커는 IMoniker::BindToObject에서 반환되고 브라우저는 요청한 초기화된 개체를 받습니다.
브라우저는 IOleObject 를 쿼리하고 개체를 문서 개체로 호스트합니다. (이 시점에서 개체가 완전히 초기화되지는 않지만 유용한 항목을 표시하기에 충분할 수 있습니다. 이 경우 백그라운드에서 다운로드가 계속됩니다.)