스크립트 가능한 Mozilla 플러그인 인스턴스를 Nobject와 연결하려면 어떻게해야합니까?

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

  •  02-07-2019
  •  | 
  •  

문제

적절한 플러그인 인스턴스와 함께 쓰고있는 플러그인에서 호출 된 메소드를 연관시키는 문제가 발생합니다. 문서 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;

}

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top