다음을 통해 공유


비동기 바인딩 및 스토리지 작동 방법

비동기 스토리지는 COM 구조적 스토리지 사양을 향상시켜 인터넷과 같은 대기 시간이 긴 느린 연결 네트워크에서 스토리지 개체의 다운로드를 지원합니다. 비동기 스토리지는 비동기 모니커와 함께 작동하여 완전한 비동기 바인딩 동작을 제공합니다.

웹 페이지에 포함된 문서 개체

사용자가 웹 페이지에 포함된 문서를 나타내는 링크를 클릭하면 다음 이벤트가 발생합니다.

  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 인터페이스를 등록합니다. 마지막으로 비동기 스토리지의 IStorage 포인터를 전달하여 IPersistStorage::Load 을 호출합니다. 데이터가 백그라운드 스레드에 도착하면 모니커는 IFillLockBytes 호출하여 임시 파일의 ILockBytes 채웁니다.
    2. 개체는 초기화되었다고 판단하기에 충분한 데이터를 수신하면 스토리지에서 데이터를 읽고 IPersistStorage::Load를 반환합니다. 개체가 아직 다운로드되지 않은 데이터를 읽으려고 하면 IProgressNotify알림을 받습니다. IProgressNotify::OnProgress 메서드 내에서 다운로드 스레드는 항상 모달 메시지 루프에서 차단됩니다.
  6. 다운로드가 동기식인지 비동기식인지에 관계없이 모니커가 IMoniker::BindToObject에서 반환되며, 브라우저는 요청된 초기화된 개체를 받습니다.

  7. 브라우저는 IOleObject 쿼리하고 개체를 문서 개체로 호스트합니다. (이 시점에서 개체가 완전히 초기화되지는 않지만 유용한 항목을 표시하기에 충분할 수 있습니다. 이 경우 백그라운드에서 다운로드가 계속됩니다.)