Será que a necessidade de chamada para liberar o IShellBrowser * obtido através da WM_GETISHELLBROWSER indocumentados (WM_USER + 7) mensagem?

StackOverflow https://stackoverflow.com/questions/1909853

  •  19-09-2019
  •  | 
  •  

Pergunta

Vários têm apontado que existe uma mensagem não documentada que recupera o ponteiro de interface IShellBrowser do HWND de diálogo comum para o arquivo aberto e salvar caixas de diálogo.

Mas há informações conflitantes (ou nenhuma informação) sobre se esse ponteiro é AddRef'd, ou se é apenas o endereço matéria voltou, e não Release () deve ser chamado sobre ele?

Foi útil?

Solução

No. Você pode achar o seguinte link útil: As regras do Component Object Modelo .

Trecho:

Regras de contagem de referência

Regra 1: AddRef deve ser chamado para cada nova cópia de uma interface ponteiro, and Release chamado para cada destruição de um apontador de interface, exceto regras onde subsequentes explicitamente permitir o contrário.

As seguintes regras chamar comum nonexceptions o artigo 1.

  • Regra 1a: In-Out-parâmetros para funções. O chamador deve AddRef o parâmetro real, uma vez que será lançado pelo receptor quando o out-valor é armazenado em cima dela.
  • Regra 1b: Buscando uma variável global. A cópia local do ponteiro de interface obtido a partir de uma cópia existente do ponteiro em uma variável global deve ser independentemente referência contada porque chamado funções pode destruir a cópia no global, enquanto a cópia local ainda está vivo.
  • Regra 1c: New ponteiros sintetizados fora do "ar". Uma função que sintetiza um ponteiro de interface usando conhecimento interno especial, em vez de obtê-la de alguma outra fonte, deve fazer um AddRef inicial no ponteiro recém-sintetizado. Exemplos importantes de tais rotinas incluem rotinas de Criação de Instância, implementações de IUnknown :: QueryInterface, e assim por diante.
  • Regra 1D: Retornando uma cópia de um ponteiro armazenada internamente. Após o ponteiro foi retornado, o receptor não tem idéia de como sua vida se relaciona com a da cópia armazenada internamente o ponteiro. Assim, o receptor deve chamar AddRef na cópia ponteiro antes de devolvê-lo.

Regra 2: conhecimento especial por parte de um pedaço de código do relações dos começos e as terminações dos tempos de vida de dois ou mais cópias de um apontador de interface pode permitir pares AddRef / versão para ser omitidos.

  • Da perspectiva, de contagem de referência de um cliente COM é sempre um conceito por interface. Os clientes nunca deve assumir que um objeto usa a mesma contagem de referência para todas as interfaces.
  • Os valores de retorno de AddRef e lançamento não deve ser invocado, e deve ser usado somente para fins de depuração.
  • estabilidade Pointer; veja detalhes no arquivo de Ajuda OLE em "Regras de contagem de referência", subseção "estabilizar a esse ponteiro e mantê-la válida."

Veja o excelente "Gerenciando Objeto Vidas em OLE" artigo técnico por Douglas Hodges, e o capítulo 3 do Dentro OLE, 2ª edição, por Kraig Brockschmidt (MSDN Library, Livros) para obter mais informações sobre de contagem de referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top