Será que a necessidade de chamada para liberar o IShellBrowser * obtido através da WM_GETISHELLBROWSER indocumentados (WM_USER + 7) mensagem?
-
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?
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.