스크립트 가능한 Mozilla 플러그인 인스턴스를 Nobject와 연결하려면 어떻게해야합니까?
문제
적절한 플러그인 인스턴스와 함께 쓰고있는 플러그인에서 호출 된 메소드를 연관시키는 문제가 발생합니다. 문서 http://developer.mozilla.org/en/gecko_plugin_api_reference/scripting_plugins 이것에 진정으로 유용 할 수있는 충분한 정보를 제공하지 않습니다.
간단히 말해서, 나는 npppluginscriptablenpobject와 같은 변수 인수를 가진 npp_getValue에 대한 호출에 대한 응답으로 플러그인이 반환 될 것으로 예상되는 스크립트 가능한 객체를 이해하려고합니다. 플러그인의 각 인스턴스에 대한 npobject 인스턴스가 있어야한다고 생각하지만, npclass의 invoke () 메소드는 스크립트 가능한 npobject에서 플러그인 인스턴스 (npp)를 찾아야하는 방법은 무엇입니까? 나는 그것을하기 위해 조회 테이블을 구현할 수 있다고 생각하지만, 내가 놓친 것이 분명하다고 느낀다.
NPP_New ()의 NPP의 PDATA 멤버의 C ++ 클래스 인스턴스 (인스턴스가 플러그인의 기능을 구현)에 대한 포인터를 저장하고 있습니다.
해결책
내 자신의 질문에 대답하는 것 같아요 ...
내가 찾은 솔루션 (그리고 그 유효성에 대한 의견에 여전히 감사 할 것입니다. 특히 더 나은 방법이 있다고 생각하는 경우)는 allocate () 기능에 내 구현 클래스에 대한 포인터가있는 NPobject 파생 구조를 할당하는 것이 었습니다. 내 플러그인에서 Firefox로. 그런 다음 NPP의 PDATA 멤버 인 NPP_NEW ()에 NPOBJECT에 대한 포인터를 저장합니다.
invoke ()에서, 나는 구현 클래스의 인스턴스에 대한 포인터를 얻을 수 있도록 파생 구조의 추가 멤버로 얻는 npobject 포인터를 시전합니다.
내가 알 수있는 한, 디자인의 의도입니다. npobject 객체는 그들이 가리키는 npclass의 인스턴스이며, 이들 엔티티를 다루는 npclass 함수 포인터를 통해 메소드와 속성을 구현하며 모든 개인 데이터가 예상됩니다. 구현에 의해 할당되고 거래되며 그 형식은 지정되지 않습니다.
다음과 같이 보일 것입니다.
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;
}