Partilhar via


Como funciona a vinculação assíncrona e o armazenamento

O armazenamento assíncrono aprimora a especificação de armazenamento estruturado COM para oferecer suporte ao download de objetos de armazenamento em redes de conexão lenta de alta latência, como a Internet. O armazenamento assíncrono funciona em conjunto com identificadores assíncronos para fornecer um comportamento de associação assíncrona completo.

Objeto de documento incorporado em uma página da Web

Quando um usuário clica em um link que representa um documento incorporado em uma página da Web, ocorrem os seguintes eventos:

  1. O navegador chama o função MkParseDisplayName, passando o URL do link.

  2. MkParseDisplayName analisa o URL, cria um moniker assíncrono correspondente e retorna um ponteiro para a interface IMoniker do moniker.

  3. O navegador chama IsAsyncMoniker para determinar se o moniker é assíncrono, cria um contexto de ligação, regista a interface IBindStatusCallback no contexto de ligação, somente se o moniker for assíncrono, e chama IMoniker::BindToObjectpassando o contexto de ligação.

  4. O moniker liga-se ao objeto e consulta-o para obter a interface IPersistMoniker, que indica se o objeto suporta vinculação assíncrona e armazenamento. Se o objeto retornar um ponteiro para IPersistMoniker:

    1. O moniker URL chama IPersistMoniker::Load, passando seu próprio IMoniker ponteiro para o objeto.
    2. O objeto modifica o contexto de ligação, escolhe se deseja um armazenamento bloqueante ou não bloqueante, regista o seu próprio IBindStatusCallback e chama IMoniker::BindToStorage no ponteiro que recebeu através de IPersistMoniker::Load.
    3. O moniker cria um armazenamento assíncrono, mantém uma referência à interface IFillLockBytes do objeto wrapper, regista a interface IProgressNotify no armazenamento raiz e chama IPersistStorage::Load, passando o ponteiro IStorage do armazenamento assíncrono. À medida que os dados chegam (em um thread em segundo plano), o moniker chama IFillLockBytes para preencher o ILockBytes no arquivo temporário.
    4. O objeto lê dados do armazenamento e retorna de IPersistMoniker::Load quando recebeu dados suficientes para se considerar inicializado. Se o objeto tentar ler dados que ainda não foram baixados, o downloader receberá uma notificação em IProgressNotify. Dentro do método IProgressNotify::OnProgress, o thread de download bloqueia num loop de mensagem modal ou faz com que o armazenamento assíncrono retorne E_PENDING, dependendo se o objeto solicitou um armazenamento de bloqueio ou sem bloqueio.
  5. Se o objeto não implementar IPersistMoniker , o moniker consultará IPersistStorage, que indica que o estado persistente do objeto está armazenado em um objeto de armazenamento. Se o objeto retornar um ponteiro para IPersistStorage:

    1. O Moniker chama IMoniker::BindToStorage em si mesmo, solicitando um bloqueio IStorage (porque o objeto não reconhece assíncronos), cria um armazenamento assíncrono, mantém uma referência à interfaceIFillLockBytesdo objeto wrapper, registra a interfaceIProgressNotifyno armazenamento raiz e chama IPersistStorage:: Carregue, passando o ponteiro IStorage do armazenamento assíncrono. À medida que os dados chegam (em um thread em segundo plano), o moniker chama IFillLockBytes para preencher o ILockBytes no arquivo temporário.
    2. O objeto lê dados do armazenamento e retorna de IPersistStorage::Load quando recebeu dados suficientes para se considerar inicializado. Se o objeto tentar ler dados que ainda não foram baixados, ele receberá uma notificação no IProgressNotify. Dentro do método IProgressNotify::OnProgress, a sequência de download está sempre bloqueada num loop de mensagem modal.
  6. Independentemente de o download ser síncrono ou assíncrono, o moniker retorna de IMoniker::BindToObjecte o navegador recebe o objeto inicializado solicitado.

  7. O navegador consulta IOleObject e hospeda o objeto como um objeto de documento. (Neste ponto, o objeto pode não ser inicializado completamente, mas o suficiente para exibir algo útil, caso em que o download continua em segundo plano.)