Partilhar via


Precauções da função gancho In-Context

Por motivos de desempenho, os desenvolvedores cliente registram funções de gancho no contexto. No entanto, como essas funções de gancho são mapeadas para o espaço de endereço do servidor, os desenvolvedores de cliente e servidor devem tomar precauções para garantir que o processamento de eventos ocorra sem problemas.

Precauções para desenvolvedores cliente

Os desenvolvedores cliente devem estar cientes dos seguintes problemas:

  • As funções de gancho no contexto não devem usar muito tempo de processador, pois a função de gancho deve retornar antes que o aplicativo de servidor continue.
  • Depois que um evento é disparado, é possível que a janela associada a um evento não exista mais no momento em que a função de gancho é chamada. Os clientes devem verificar se a janela associada a um evento ainda existe antes de executar qualquer outra ação relacionada ao evento. Para garantir que uma janela ainda exista, os clientes usam a função IsWindow do Microsoft Win32.
  • Se a DLL na qual a função de gancho for definida for vinculada a outra DLL, os desenvolvedores cliente deverão garantir que o sistema carregue a outra DLL. Se estiver vinculando implicitamente (usando arquivos .def e importações), a DLL adicional deverá estar no diretório do Windows ou em um dos diretórios do sistema, como Windows\System, Windows\System32 ou Windows\SysWOW64. Se estiver vinculando explicitamente (usando LoadLibrary), o caminho completo para o diretório no qual reside a DLL adicional deverá ser especificado na chamada para LoadLibrary.
  • As funções de gancho no contexto podem causar um estouro de pilha quando a DLL que contém a função de gancho é carregada em um aplicativo de 16 bits. Esse problema ocorre porque aplicativos de 16 bits usam um tamanho de pilha fixo que não é grande o suficiente para acomodar a cadeia de chamadas de função do sistema que resultam em uma chamada para a função de gancho.

Precauções para desenvolvedores de servidores

Os desenvolvedores de servidores precisam estar cientes de que os aplicativos cliente podem registrar funções de gancho no contexto. Quando um servidor chama NotifyWinEvent, ele deve estar preparado para lidar com WM_GETOBJECT e outros métodos IAccessible .

Ponteiros de interface inválidos

Quando um cliente chama AccessibleObjectFromEvent dentro de uma função de gancho no contexto, o ponteiro de interface IAccessible que é retornado aponta diretamente para o código no espaço de endereço do servidor. Se o cliente chamar uma propriedade de interface usando esse ponteiro, a biblioteca COM (Component Object Model) não estará envolvida com marshaling (empacotamento e envio de parâmetros de interface entre limites de processo) ou unmarshaling (desempacotar parâmetros que foram enviados entre limites do processo) e não detectará se um objeto foi destruído.

Se o cliente chamar uma propriedade de interface para um objeto que é destruído, o ponteiro de interface inválido causará uma falha de Proteção Geral no espaço de endereço do servidor, a menos que o servidor detecte essa situação.

Para proteger contra ponteiros de interface inválidos, os servidores criam objetos proxy que encapsulam objetos acessíveis e monitoram o tempo de vida dos objetos acessíveis. Por exemplo, quando um cliente chama uma propriedade IAccessible para obter informações sobre um objeto , o proxy verifica se o objeto acessível ainda está disponível e, nesse caso, encaminha a solicitação do cliente para o objeto acessível. Se o objeto acessível for destruído, o proxy retornará um erro para o cliente.