Pergunta

Eu estou correndo em um problema associando um método chamado em um plugin que estou escrevendo com a instância do plugin apropriado. A documentação em http://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins não dá informações suficientes para ser verdadeiramente útil sobre este assunto.

Em poucas palavras, eu estou tentando entender exatamente qual objeto programável é esperado que o plug-in para retornar em resposta a uma chamada para NPP_GetValue com o argumento variável igual para NPPpluginScriptableNPObject. Eu estou supondo que deve haver uma instância NPObject para cada instância do plugin, mas como é o método () no NPClass invoke suposto encontrar a instância do plugin (NPP) da NPObject programável é dado como um argumento? Acho que eu poderia implementar uma tabela de pesquisa para fazer isso, mas tenho a sensação de que há algo óbvio que estou em falta.

eu sou armazenar um ponteiro para uma instância de uma classe C ++ (a ocorrência implementa a funcionalidade do plug-in) no membro pdata da CN, em NPP_New ().

Foi útil?

Solução

Eu acho que eu estou respondendo a minha própria pergunta ...

A solução que eu encontrei (e eu ainda apreciar comentários sobre a sua validade, especialmente se você acha que há uma maneira melhor de fazê-lo) foi de atribuir um NPObject estrutura que possui um ponteiro para a minha classe de implementação na alocar derivado () função que eu exponha ao Firefox do meu plugin. Eu, então, armazenar um ponteiro para que NPObject no membro pdata do NPP, no NPP_New ().

Em invoke (), eu converter o ponteiro NPObject eu começar a membros adicionais da estrutura derivada, para que eu possa obter um ponteiro para a instância da classe de implementação.

Isso, tanto quanto eu posso dizer, é a intenção do design - objetos NPObject são instâncias do NPClass eles apontam, eles implementar métodos e propriedades através dos ponteiros de função NPClass que lidam com estas entidades, bem como quaisquer dados privados está prevista para ser alocados e desalocados pela implementação, e seu formato não é especificado.

Seria algo parecido com isto:

 static NPClass refObject = {
    NP_CLASS_STRUCT_VERSION,
    My_Allocate,
    My_Deallocate,
    NULL,
    My_HasMethod,
    My_Invoke,
    My_InvokeDefault,
    My_HasProperty,
    My_GetProperty,
    NULL,
    NULL,
};

class MyImplClass {
    // Implementation goes here
};

struct MyNPObject : public NPObject {
    MyImplClass *my_impl_instance;
};

// This is just a bit of memory management - Mozilla wants us to allocate our own memory:
NPObject *My_Allocate(NPP inst, NPClass *)
{
    // We initialize the structure in NPP_New() below
    return (NPObject *)malloc(sizeof(MyNPObject));
}

NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
             char* argn[], char* argv[], NPSavedData* saved )
{
    NPObject *scriptable_object = npnfuncs->createobject(instance, &refObject);
    npnfuncs->retainobject(scriptable_object);
    MyImplClass *new_player = new MyImplClass(); 

    instance->pdata = scriptable_object;
    ((MyNPObject*)instance->pdata)->my_impl_instance = new_player;
    return NPERR_NO_ERROR;

}

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