Compartilhar via


Visualizar manipuladores e host de visualização do Shell

Manipuladores de visualização são chamados quando um item é selecionado para mostrar uma visualização leve, rica e somente leitura do conteúdo do arquivo no painel de leitura do modo de exibição. Isso é feito sem iniciar o aplicativo associado do arquivo.

Este tópico discute os seguintes tópicos:

Arquitetura do manipulador de visualização

Um manipulador de visualização é um aplicativo hospedado. Os hosts incluem o Windows Explorer no Windows Vista ou no Microsoft Outlook 2007. Os hosts implementam IPreviewHandlerFrame como um método de comunicação entre o manipulador de visualização e o host.

O próprio manipulador de visualização implementa essas interfaces:

Seu manipulador é chamado por meio de seu IObjectWithSite, que retorna um ponteiro IUnknown por meio do qual você solicita um objeto IPreviewHandlerFrame para interagir com o host.

Opções de modelo de servidor

Manipuladores de visualização sempre ficarão sem processo. Há dois métodos para implementar isso:

  1. Um manipulador de visualização pode ser criado como um servidor em processo, mas executado por meio de um host alternativo fora do processo. Este é o método preferencial. O sistema fornece um host alternativo para isso no arquivo Prevhost.exe. Os manipuladores de visualização criados por esse método não são compatíveis com o Outlook 2007 no Windows XP. No entanto, esses mesmos manipuladores funcionarão no Windows Explorer e no Outlook 2007 em execução no Windows Vista.
  2. Um manipulador de visualização pode ser criado como um servidor COM (Component Object Model) local. Isso não é recomendado por vários motivos. Primeiro, a implementação de um servidor em processo é mais fácil. Mais importante, a implementação como um servidor em processo fornece maior controle sobre o tempo de vida do objeto manipulador, o que permite uma melhor limpeza e eficiência.

Por padrão, os manipuladores de visualização são executados em um processo il (baixo nível de integridade) por motivos de segurança. Opcionalmente, você pode desabilitar a execução como um processo il baixo definindo o valor a seguir no Registro. No entanto, não é recomendável fazer isso. Os sistemas podem eventualmente ser configurados para rejeitar qualquer processo que não seja il baixo.

HKEY_CLASSES_ROOT
   CLSID
      {YOUR HANDLER'S CLSID}
         DisableLowILProcessIsolation [DWORD] = 1

Manipuladores de visualização diferentes compartilham o mesmo processo por padrão. Duas instâncias de Prevhost.exe podem ser executadas simultaneamente; um para manipuladores em execução como processos il baixos, um para manipuladores que recusaram esse comportamento.

Inicialização

Assim como acontece com manipuladores de miniaturas e propriedades, é altamente recomendável inicializar o manipulador com um fluxo. Você pode inicializar por meio de um arquivo ou item, se necessário, mas os fluxos fornecem a maneira mais segura de implementar um manipulador. A inicialização por meio de um fluxo garante a integridade do arquivo e os benefícios de estabilidade para o sistema de execução do manipulador como um processo il baixo, como proteger o sistema contra estouros de buffer, limitar onde um manipulador pode gravar informações e limitar a comunicação com outras janelas.

Se você precisar inicializar com um arquivo ou item shell, armazene o caminho do arquivo ou uma referência ao IShellItem. Não leia dados dessas fontes até que IPreviewHandler::D oPreview seja chamado.

Em geral, a inicialização não deve fazer nenhum trabalho pesado, como redigir e armazenar uma imagem de visualização. Para obter a eficiência ideal, esse tipo de processamento não deve ser feito até que a versão prévia seja solicitada.

Fluxo de Dados do Manipulador de Visualização

O fluxo de dados no processo de visualização segue o caminho geral mostrado aqui. O host pode ser considerado como Windows Explorer no Windows Vista ou no Outlook 2007.

  1. O manipulador de visualização é inicializado, preferencialmente com um fluxo.
  2. A janela de exibição é passada do host para o manipulador por meio de IPreviewHandler::SetWindow.
  3. Neste ponto, o manipulador não deve fazer mais nada até que IPreviewHandler::D oPreview seja chamado.
  4. A visualização é exibida no painel de leitura por meio de uma chamada para IPreviewHandler::D oPreview.
  5. O tamanho da janela é definido por meio de IPreviewHandler::SetRect.
  6. A janela é redimensionada quando necessário por meio de IPreviewHandler::SetRect.
  7. A visualização é descarregada e seus recursos liberados quando não são mais necessários, por meio de uma chamada para IPreviewHandler::Unload.

Depurando um manipulador de visualização

Se você seguiu as recomendações para implementar seu manipulador de visualização como um servidor em processo, para depurar seu manipulador de visualização, você pode anexar a Prevhost.exe. Conforme mencionado anteriormente, lembre-se de que pode haver duas instâncias de Prevhost.exe, uma para processos normais baixos de IL e outra para os manipuladores que optaram por não executar como um processo de IL baixo.

Se você não encontrar Prevhost.exe em sua lista de processos disponíveis, ele provavelmente não foi carregado nesse momento. Clicar em um arquivo para uma visualização carrega o substituto e, em seguida, ele deve aparecer como um processo anexável.

Fornecendo seu próprio processo para um manipulador de visualização

Se você quiser forçar a criação de um novo processo para o manipulador em vez de executar sob o processo padrão, crie uma nova subchave para o manipulador em AppID e defina sua entrada DllSurrogate como "Prevhost.exe". Use essa subchave AppID em vez do padrão Prevhost.exe AppID.

Ao fornecer um novo processo, o manipulador pode evitar a execução em um processo compartilhado, como faria por padrão. Isso pode permitir, por exemplo, garantir a versão específica do CLR (Common Language Runtime) no processo. Isso será necessário se você estiver criando uma implementação gerenciada de um manipulador de visualização.

Observação

Manipuladores de visualização de 32 bits devem usar AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} quando instalados em sistemas operacionais de 64 bits.

 

Criando manipuladores de visualização

Como registrar um manipulador de visualização

Diretrizes do manipulador de visualização