2008-09-24 3 views
1

필자가 해당 플러그인 인스턴스로 작성중인 플러그인에서 호출 된 메소드를 연결하는 데 문제가 있습니다. http://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins에있는 문서는이 정보가 실제로 유용 할만큼 충분한 정보를 제공하지 않습니다.스크립팅 가능한 모질라 플러그인 인스턴스를 NOBject와 어떻게 연관시킬 수 있습니까?

간단히 말해, 플러그인이 NPP_GetValue에 대한 호출로 반환 할 것으로 예상되는 스크립트 가능 객체를 NPPpluginScriptableNPObject와 같은 가변 인수로 이해하려고합니다. 플러그인의 각 인스턴스에 대해 NPObject 인스턴스가 있어야한다고 추측하고 있지만 NPClass의 invoke() 메소드는 인수로 주어진 스크립트 가능한 NPObject에서 플러그인 인스턴스 (NPP)를 찾으려면 어떻게해야합니까? 그 일을 할 수있는 룩업 테이블을 구현할 수 있다고 생각합니다.하지만 실종 된 것 같은 느낌이 들었습니다.

NPP_New()에서 NPP의 pdata 멤버에 C++ 클래스 (인스턴스가 플러그인의 기능을 구현)의 인스턴스에 대한 포인터를 저장하고 있습니다. 나는 내 자신의 질문에 대답 것 같아

답변

1

...

내가 찾은 해결책은 할당했다 (그리고 나는 아직도 당신이 일을 더 나은 방법이 있다고 생각 특히, 유효성에 대한 의견을 부탁드립니다) 내 구현 클래스에 대한 포인터가 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; 

}

+1

당신은 본질적에 명중했다. 원하는 경우 NPObject를 확장하는 자신 만의 객체를 사용하여 좀 더 멋지고 객체 지향적으로 만들 수 있습니다. FireBreath 프로젝트에서 이에 대한 좋은 예를 찾을 수 있으며 체크 아웃하는 것이 좋습니다. http://code.google.com/p/firebreath/source/browse/src/NpapiPlugin/NPJavascriptObject.h를 참조하십시오. – taxilian

관련 문제