Pergunta

Estou confuso sobre a contagem de ref em NPAPI. Principalmente, não sei qual método aumentará a contagem de ref. Alguém pode explicar em detalhes sobre isso? Para a conveniência, listei as funções mais comuns de npn_* usadas aqui e meu próprio entendimento:

Npn_createObject: Defina o referente para 0

Npn_retainObject: Inc Ref Count

Npn_releaseObject: Dec Re -count

Npn_evaluate: ?? (no caso de devolver um npObject*)

Npn_getValue: ?? (no caso de devolver um npObject*)

Npn_setValue: ?? (no caso definido como um nPObject*)

Npn_getProperty: ?? (no caso de devolver um npObject*)

Npn_setProperty: ?? (no caso definido como um nPObject*)

Npn_removeProperty: ??

Npn_enumerate: ??

Npn_construct: ??

Outra coisa: o npapi é o lançamento aninhado? (No caso de nPObject* com uma propriedade do NPObject*, o painel de liberação diminuirá a contagem de referências da criança).

Obrigado.

Foi útil?

Solução

Não há espaço nos comentários para responder bem à sua pergunta no comentário, então vou colocar em outra resposta.

Sempre que seu código obtém um NPObject de uma função nPObject (uma das que você mencionou acima), você deve liberar esse nPObject quando terminar. (Isso pode ser imediatamente, ou você pode salvá -lo por um tempo e liberá -lo quando seu objeto for destruído). O mesmo vale para um npvariant. Isso faz não Segure os argumentos transmitidos para a sua função Invoke, mas o valor de retorno que você definir será liberado pelo navegador quando estiver pronto.

Quando você liga para npn_getValue e obtém um NPObject a partir daí, que também deve ser lançado. Isso significa que, quando o navegador chama NPP_GetValue, ele liberará seu NPOBject quando estiver pronto. Se você deseja criar um novo nPObject toda vez que o navegador chama NPP_GetValue para obter seu NPObject, você não precisará ligar para o npn_retainObject nele; A suposição no exemplo nPAPI é que você está salvando uma cópia do seu NPObject para que ele não seja excluído até que seu objeto de plug -in seja excluído.

Como o navegador ligará para a liberação de toda vez que ele chama NPP_GetValue para obter seu NPOBject, você precisa garantir que o refCount seja incrementado antes de devolvê -lo. A razão pela qual você não precisa chamá -lo duas vezes no caso de manter é que npn_createObject faz uma retenção implícita antes de retornar seu objeto.

Eu escrevi uma explicação mais detalhada aqui:

Outras dicas

Primeiro, para corrigir um equívoco: npn_createObject define o refCount como 1, não para 0. Então, quando você chama npn_retainObject, incrementa o refco e o npn_releaseObject o diminuirá. Se o releaseBject diminuir o refCount para 0, ele também o libertará chamando a função Deallocate do seu npclass (que deve excluir o NpoBject após fazer qualquer limpeza necessária)

Vejo: https://developer.mozilla.org/en/npclass

Além disso, uma boa regra geral para qualquer uma das outras funções da NPCLASS é que, sempre que você colocar um NPObject em um NPVariant, você precisa chamar NPN_retainObject. Para lembrar disso, lembre -se de que, quando terminar com um NPVariant (que você usou e terminou, não um que foi aprovado como um valor de retorno), você chama npn_releasevariantValue, que liberará os dados do NPString se for um String ou o NPObject se for um objeto.

Portanto, de qualquer um dos outros métodos, se você estiver retornando um NPObject, precisará ligar para o npn_retainObject antes de encher o npvariant. Além disso, se você salvar uma cópia do NPObject, deverá ligar para o npn_retainobject nele e npn_releaseObject quando terminar de salvá -lo. Também menciona que você nunca deve chamar nenhum método npn_ de um thread que não seja o encadeamento principal.

Isso ajuda?

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