Partilhar via


Visualizar Armazenamento em Cache

Um aplicativo de contêiner deve ser capaz de obter uma apresentação de um objeto com a finalidade de exibi-lo ou imprimi-lo para os usuários quando o documento estiver aberto, mas o aplicativo de servidor do objeto não estiver em execução ou não estiver instalado na máquina do usuário. Supor, no entanto, que os servidores para todos os objetos que podem ser encontrados em um documento estão instalados na máquina de cada usuário e sempre podem ser executados sob demanda é irrealista. O manipulador de objetos padrão, que está disponível em todos os momentos, resolve esse dilema armazenando em cache apresentações de objetos no armazenamento do documento e manipulando essas apresentações em qualquer plataforma, independentemente da disponibilidade do servidor de objetos em qualquer instalação específica do contêiner.

Os contêineres podem manter apresentações de desenho para um ou mais dispositivos de destino específicos, além do necessário para manter o objeto na tela. Além disso, se você portar o objeto de uma plataforma para outra, o OLE converte automaticamente os formatos de dados do objeto para os suportados na nova plataforma. Por exemplo, se você mover um objeto do Windows para o Macintosh, OLE converterá suas apresentações de metarquivo para formatos PICT.

Para apresentar uma representação precisa de um objeto incorporado ao usuário, o aplicativo de contêiner do objeto inicia uma caixa de diálogo com o manipulador de objetos, solicitando dados e instruções de desenho. Para ser capaz de atender às solicitações do contêiner, o manipulador deve implementar o IDataObject, IViewObject2e IOleCache interfaces.

IDataObject permite que um aplicativo de contêiner OLE obtenha dados e envie dados para seus objetos incorporados ou vinculados. Quando os dados são alterados em um objeto, essa interface fornece uma maneira para o objeto disponibilizar seus novos dados para seu contêiner e fornece ao contêiner uma maneira de atualizar os dados em sua cópia do objeto. (Para uma discussão sobre a transferência de dados em geral, consulte o Capítulo 4, Transferência de dados.)

A interface IViewObject2 é muito parecida com a interface IDataObject, exceto que ela pede que um objeto se desenhe em um contexto de dispositivo, como uma tela, impressora ou metaarquivo, em vez de mover ou copiar seus dados para a memória ou algum outro meio de transferência. O objetivo da interface é permitir que um contêiner OLE obtenha representações pictóricas alternativas de seus objetos incorporados, cujos dados ele já possui, evitando assim a sobrecarga de ter que transferir instâncias inteiramente novas dos mesmos objetos de dados simplesmente para obter novas instruções de desenho. Em vez disso, a interfaceIViewObject2 permite que o contentor peça a um objeto para fornecer uma representação pictórica própria, desenhando num contexto de dispositivo especificado pelo contentor.

Ao chamar a interface IViewObject2 , uma aplicação de contêiner também pode especificar que o objeto seja desenhado em um dispositivo de destino diferente daquele em que será realmente renderizado. Isso permite que o contêiner, conforme necessário, gere renderizações diferentes a partir de um único objeto. Por exemplo, o chamador pode pedir ao objeto que se componha para uma impressora, ainda que a imagem resultante seja renderizada no ecrã. O resultado, é claro, seria uma visualização impressa do objeto.

A interfaceIViewObject2 também fornece métodos que permitem que os contêineres se registrem para notificações de alteração de exibição. Assim como acontece com os avisos de dados e OLE, uma conexão de aviso de exibição permite que um contêiner atualize suas renderizações de um objeto de acordo com sua própria conveniência, em vez de em resposta a uma chamada do objeto. Por exemplo, se uma nova versão do aplicativo de servidor de um objeto oferecesse exibições adicionais dos mesmos dados, o manipulador padrão do objeto chamaria a implementação de cada contêiner de IAdviseSink::OnViewChange para informá-los de que as novas apresentações estavam disponíveis. O contentor recuperaria esta informação do ponto de notificação apenas quando necessário.

Como os contextos de dispositivo Windows têm significado apenas dentro de um único processo, você não pode passar ponteiros IViewObject2 através dos limites do processo. Como resultado, os servidores OLE locais e remotos não têm necessidade alguma de implementar a interface, que não funcionaria corretamente, mesmo que funcionassem. Somente manipuladores de objetos e servidores em processo implementam o interface deIViewObject2. OLE fornece uma implementação padrão, que você pode usar em seus próprios servidores OLE em processo e manipuladores de objetos simplesmente agregando o manipulador padrão OLE. Ou você pode escrever sua própria implementação de IViewObject2.

Um objeto implementa o IOleCache interface para permitir que o manipulador saiba quais recursos ele deve armazenar em cache. O manipulador de objetos também possui o cache e garante que ele seja mantido atualizado. À medida que o objeto incorporado entra no estado de execução, o manipulador configura conexões de aviso apropriadas no objeto do servidor, com ele mesmo agindo como o coletor. O IDataObject e as implementações de interface IViewObject2operam com dados armazenados em cache no lado do cliente. A implementação do manipulador de IViewObject2é responsável por determinar quais formatos de dados armazenar em cache para satisfazer as solicitações de desenho do cliente. A implementação do manipulador de IDataObject é responsável por obter dados em vários formatos, etc., entre a memória e o subjacente IStorage instância do objeto incorporado. Os manipuladores personalizados podem usar essas implementações agregando no manipulador padrão.

Observação

A interfaceIViewObject2 é uma extensão funcional simples de IViewObject e deve ser implementada em vez da última interface, que agora está obsoleta. Além de fornecer os métodos IViewObject, a interface IViewObject2 do fornece um único membro adicional, GetExtent, que permite que uma aplicação contentor obtenha o tamanho da apresentação de um objeto do cache sem ter primeiro de mover o objeto para o estado ativo com uma chamada para IOleObject::GetExtent.

 

Documentos compostos