Wie kann ich eine skriptfähige Mozilla Plugin-Instanz mit ihrem NObjekt assoziieren?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin in ein Problem laufen eine aufgerufene Methode in einem Plugin Assoziieren ich mit dem entsprechenden Plugin-Instanz gerade schreibe. Die Dokumentation unter http://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins nicht genügend Informationen gibt wirklich nützlich für diese sein.

Auf dem Punkt gebracht, ich versuche nur zu verstehen, welche skriptfähige Objekt des Plugin erwartet wird, als Antwort auf einen Aufruf von NPP_GetValue mit dem variablen Argumente gleich NPPpluginScriptableNPObject zurückzukehren. Ich vermute, dass es für jede Instanz des Plugins eine NPObject Instanz sein, aber wie wird die Methode invoke () in der NPClass soll die Plugin-Instanz (NPP) von der skript NPObject finden, es als Argument angegeben wird? Ich glaube, ich könnte eine Lookup-Tabelle implementieren, das zu tun, aber ich habe das Gefühl, es ist etwas offensichtlich fehle ich.

Ich bin einen Zeiger auf eine Instanz einer C ++ Klasse Speicher (die Instanz implementiert die Funktionalität der Plug-In) in dem pdata Mitglied des NPP, in NPP_New ().

War es hilfreich?

Lösung

Ich glaube, ich bin meine eigene Frage zu beantworten ...

Die Lösung fand ich (und ich würde immer noch schätzen Kommentare auf ihre Gültigkeit, vor allem, wenn Sie denken, es gibt einen besseren Weg, es zu tun) war eine NPObject abgeleitete Struktur zuzuordnen, die einen Zeiger auf meine Implementierungsklasse in der Zuweisung hat () Funktion, die ich zu Firefox von meinem Plugin aus. I speichert dann einen Zeiger auf diese in dem PDATA NPObject Mitglied NPP, in NPP_New ().

In invoke (), warf ich den NPObject Zeiger I auf die abgeleitete Struktur zusätzliche Mitglieder zu bekommen, so dass ich einen Zeiger auf die Instanz der Implementierungsklasse bekommen kann.

Das, soweit ich das beurteilen kann, ist die Absicht des Designs - NPObject Objekte sind Instanzen der NPClass sie zeigen auf, setzen sie Methoden und Eigenschaften durch die NPClass Funktionszeiger, die mit diesen Unternehmen beschäftigen, und alle privaten Daten wird erwartet, dass durch die Umsetzung zugewiesen und freigegeben werden, und sein Format ist nicht spezifiziert.

Es würde wie folgt aussehen:

 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;

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top