...
내가 찾은 해결책은 할당했다 (그리고 나는 아직도 당신이 일을 더 나은 방법이 있다고 생각 특히, 유효성에 대한 의견을 부탁드립니다) 내 구현 클래스에 대한 포인터가 allocate() 함수에서 포인터를 가지고있는 NPObject 파생 구조입니다. 플러그인에서 Firefox에 노출됩니다. 그런 다음 해당 NPObject에 대한 포인터를 NPP의 pdata 멤버 인 NPP_New()에 저장합니다.
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;
}
당신은 본질적에 명중했다. 원하는 경우 NPObject를 확장하는 자신 만의 객체를 사용하여 좀 더 멋지고 객체 지향적으로 만들 수 있습니다. FireBreath 프로젝트에서 이에 대한 좋은 예를 찾을 수 있으며 체크 아웃하는 것이 좋습니다. http://code.google.com/p/firebreath/source/browse/src/NpapiPlugin/NPJavascriptObject.h를 참조하십시오. – taxilian