Compartilhar via


Registrando e distribuindo manipuladores de propriedade

Este tópico explica como criar e registrar manipuladores de propriedades para trabalhar com o sistema de propriedades do Windows.

Este tópico é organizado da seguinte maneira:

Registrando e distribuindo manipuladores de propriedade

Depois que o manipulador de propriedades for implementado, ele deverá ser registrado e sua extensão de nome de arquivo deverá ser associada ao manipulador. O exemplo a seguir usando a extensão .recipe ilustra as entradas do Registro necessárias para fazer isso.

HKEY_CLASSES_ROOT
   CLSID
      {50d9450f-2a80-4f08-93b9-2eb526477d1a}
         (Default) = Recipe Property Handler
         ManualSafeSave [REG_DWORD] = 00000001
         InProcServer32
            (Default) = C:\\SDK\\PropertyHandlerSample\\bin\\RecipeHandlers.dll
            ThreadingModel = Apartment
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     .recipe
                        (Default) = {50d9450f-2a80-4f08-93b9-2eb526477d1a}

Manipuladores de propriedade para um tipo de arquivo específico geralmente são distribuídos com os aplicativos que criam ou manipulam arquivos desse tipo. No entanto, você também deve considerar disponibilizar seus manipuladores de propriedade independentemente desses aplicativos para dar suporte à indexação do tipo de arquivo em cenários de servidor em que os manipuladores de propriedade são usados pelo indexador, mas seus aplicativos que acompanham não são necessários. Se você criar um pacote de instalação autônomo para o manipulador de propriedades, certifique-se de que ele inclua o seguinte:

  • Os detalhes de registro do manipulador de propriedades especificados no tópico Registering and Distributing Property Handlers.
  • Registro para o tipo de arquivo e todos os arquivos de esquema que devem ser instalados, para permitir que os clientes acessem todos os recursos do manipulador de propriedades.

Considerações de desempenho e confiabilidade para manipuladores de propriedade

Manipuladores de propriedade são invocados para cada arquivo em um computador específico. Eles geralmente são chamados sob as seguintes circunstâncias:

  • Durante a indexação do arquivo. Isso é feito fora do processo, em um processo isolado com direitos restritos.
  • Quando os arquivos são acessados no Windows Explorer com a finalidade de ler e gravar valores de propriedade. Isso é feito em processo.

Diretrizes para desempenho e confiabilidade

A qualquer momento, um usuário pode ter dezenas de milhares de arquivos de qualquer tipo específico (incluindo o seu) em seus computadores e pode acessar ou modificar qualquer um desses arquivos a qualquer momento. Como os manipuladores de propriedades são frequentemente invocados para dar suporte a essas operações de acesso e modificação, as características de desempenho e confiabilidade do manipulador de propriedades em ambientes ocupados e altamente simultâneos são de importância crítica.

Tenha em mente as diretrizes a seguir enquanto você está desenvolvendo e testando seu manipulador de propriedades.

  • Enumeração de propriedade

    Os manipuladores de propriedades devem ter um tempo de resposta muito rápido na enumeração de suas propriedades. Cálculos com uso intensivo de memória de valores de propriedade, pesquisas de rede ou a pesquisa de recursos diferentes do próprio arquivo devem ser evitados para garantir tempos de resposta rápidos.

  • Gravação de propriedade in-loco

    Se possível, ao lidar com arquivos de tamanho médio ou grande (várias centenas de KB ou maiores), o formato de arquivo deve ser organizado para que a leitura ou gravação de valores de propriedade não exija a leitura do arquivo inteiro do disco. Mesmo que o arquivo precise ser procurado, ele não deve ser lido na memória em sua totalidade porque isso aumenta o conjunto de trabalho do Windows Explorer ou do indexador do Windows Search enquanto eles tentam acessar ou indexar esses arquivos. Para obter mais informações, consulte Inicializando manipuladores de propriedade.

    Uma técnica útil para fazer isso é preencher o cabeçalho do arquivo com espaço extra para que, na próxima vez que um valor de propriedade precisar ser gravado, o valor possa ser gravado no local sem a necessidade de reescrever todo o arquivo. Isso requer a funcionalidade ManualSafeSave. Essa abordagem envolve algum risco extra de que a operação de gravação de arquivo possa ser interrompida enquanto a gravação estiver em andamento (devido a uma falha do sistema ou perda de energia), mas como os tamanhos de propriedade geralmente são pequenos, a probabilidade de tal interrupção é igualmente pequena e os ganhos de desempenho que podem ser realizados por meio da gravação de propriedade in-loco são considerados significativos o suficiente para justificar esse risco adicional. Mesmo assim, você deve ter o cuidado de testar sua implementação extensivamente para garantir que seus arquivos não estejam corrompidos caso ocorra uma falha no decorrer de uma operação de gravação.

    Por fim, ao implementar a gravação de propriedade in-loco com ManualSafeSave, às vezes a operação não pode ser executada in-loco e todo o fluxo deve ser reescrito de qualquer maneira. Para facilitar a reescrita, o fluxo fornecido durante a inicialização do manipulador dá suporte à interface IDestinationStreamFactory . A interface IDestinationStreamFactory permite que as implementações do manipulador obtenham um fluxo temporário para gravação; quando todas as gravações são concluídas e o método IDestinationStreamFactory::GetDestinationStream é chamado, esse fluxo é usado para substituir totalmente o fluxo de arquivos original. Quando o fluxo de destino é usado, o fluxo de arquivos original deve ser tratado como somente leitura, pois ele será substituído pelo fluxo de destino depois que o método IDestinationStreamFactory::GetDestinationStream tiver sido chamado.

  • Escolhendo seu modelo de threading COM

    Para maximizar a eficiência do manipulador de propriedades, especifique que ele usa o modelo Bothde threading COM . Isso permite o acesso direto de apartamentos STA (Windows Explorer, por exemplo) e apartamentos do MTA (agente de transferência de mensagens) (o processo SearchProtocolHost na Pesquisa do Windows, por exemplo), evitando a sobrecarga de marshaling nesses ambientes. Para obter todo o benefício do modelo de threading, todos os Both serviços dos quais seu manipulador depende também devem ser designados como Both para evitar qualquer marshaling em chamadas para esses componentes. Verifique a documentação desses serviços específicos para verificar se eles usam esse modelo de threading.

  • Simultaneidade do manipulador de propriedades

    Os manipuladores de propriedades e a interface IPropertyStore foram projetados para acesso serial em vez de simultâneo. O Windows Explorer, o indexador do Windows Search e todas as outras invocações do manipulador de propriedades da base de código do Windows garantem esse uso. Não deve haver nenhum motivo para terceiros usarem um manipulador de propriedades simultaneamente, mas esse comportamento não pode ser garantido. Além disso, embora se espere que o padrão de chamada seja serial, as chamadas podem vir em threads diferentes (por exemplo, quando o objeto está sendo chamado remotamente via COM RPC, como ocorre no indexador). Portanto, as implementações do manipulador de propriedades devem dar suporte a serem chamadas em threads diferentes e, idealmente, não devem sofrer nenhum efeito inadequado quando chamadas simultaneamente. Como o padrão de chamada pretendido é serial, uma implementação trivial usando uma seção crítica deve ser suficiente para atender a esses requisitos na maioria dos casos. É aceitável evitar o bloqueio em chamadas simultâneas usando a função TryEnterCriticalSection para detectar e falhar chamadas simultâneas.

  • Simultaneidade de arquivo

    Manipuladores de propriedade geralmente são usados em cenários em que vários aplicativos acessam um arquivo simultaneamente. Portanto, o manipulador e os aplicativos precisam gerenciar a simultaneidade especificando os modos de compartilhamento apropriados ao abrir o arquivo. Eles também precisam estar cientes do acesso que os outros aplicativos especificam e para gerenciar casos em que o acesso não é permitido. É melhor que todos os consumidores especifiquem modos liberais de compartilhamento para permitir que outras pessoas acessem o arquivo simultaneamente, mas, ao fazer isso, os problemas de consistência precisam ser gerenciados. As decisões sobre os modos de compartilhamento mais apropriados a serem usados precisam ser tomadas no contexto da comunidade de aplicativos que acessam o arquivo.

    Os sistemas de arquivos permitem que os aplicativos abram arquivos de uma maneira que lhes dê controle sobre se e como outros aplicativos podem abrir o arquivo. Os modos de compartilhamento habilitam o acesso de leitura, gravação e exclusão. O sistema de propriedades dá suporte a um subconjunto desses modos de compartilhamento, descritos na tabela a seguir.

    Modo de acesso Modo de compartilhamento
    Gravar Negar outros leitores e escritores
    Gravação (EnableShareDenyWrite) Habilitar outros leitores, negar outros gravadores
    Somente leitura (padrão) Habilitar outros leitores, negar outros gravadores
    Somente leitura (EnableShareDenyNone) Habilitar outros leitores e gravadores

     

    Manipuladores de propriedades abertos para gravação (GPS_READWRITE) negarão outros leitores e gravadores. Os manipuladores podem aceitar o comportamento que permite aos leitores especificando o EnableShareDenyWrite sinalizador (implicando habilitar a Leitura) em seu registro.

    Manipuladores de propriedade abertos para leitura (GPS_DEFAULT), por padrão, habilitam outros leitores, mas negam outros gravadores. Os manipuladores podem optar por habilitar outros gravadores especificando o EnableShareDenyNone sinalizador em seu registro. Isso significa que um manipulador pode lidar com êxito com uma situação em que o conteúdo de um arquivo é alterado enquanto o manipulador está lendo o arquivo.

    Para definições de sinalizador, consulte GETPROPERTYSTOREFLAGS.

Noções básicas sobre manipuladores de propriedade

Usando nomes de tipo

Usando listas de propriedades

Inicializando manipuladores de propriedade

Práticas recomendadas e perguntas frequentes do manipulador de propriedades