Как создать новый объект JS, используя NPAPI? - PullRequest
0 голосов
/ 27 июля 2011

Я пишу плагин NPAPI.В коде C ++ я не могу создать объект JS, используя NPAPI.Я попробовал этот метод:

Foo.js

function Foo(p)
{

   this.a=p;
}

Foo.prototype.get=function()
{
   return this.a;
}

C ++ код (я хочу создать Fooпросто связать то, что мы можем сделать в JS. var s = new Foo (2);)

    int newJSObject(const NPP instance,const NPNetscapeFuncs* npnfuncs,const string    objectName,
      const NPVariant* args,const int argsCount,NPVariant& result)
   {

       int status;

       NPObject *winobj;
       npnfuncs->getvalue(instance,NPNVWindowNPObject,&winobj);

       NPVariant npJS;
       NPIdentifier npJSId=npnfuncs->getstringidentifier(objectName.c_str());

       status=npnfuncs->getproperty(instance,winobj,npJSId,&npJS);

       NPObject* npObjJS = NPVARIANT_TO_OBJECT(npJS);

       NPVariant npPrototype;
       NPIdentifier npPrototypeId=npnfuncs->getstringidentifier("prototype");
       status=npnfuncs->getproperty(instance,npObjJS,npPrototypeId,&npPrototype);

       NPObject* npObjPrototype = NPVARIANT_TO_OBJECT(npPrototype);


       NPVariant npJSConstructor;
       NPIdentifier npJSConstructorId=npnfuncs->getstringidentifier("constructor");

       status=npnfuncs->invoke(instance,npObjPrototype,npJSConstructorId,
         args,argsCount,&npJSConstructor);

    /*
    *   destroy memory
    * */
       npnfuncs->releaseobject(winobj);
       npnfuncs->releasevariantvalue(&npJS);
       npnfuncs->releasevariantvalue(&npJSConstructor);

       result=npJS;

       return status;
    }




    NPVariant jsFoo1;
    NPVariant arg;
    DOUBLE_TO_NPVARIANT(2,arg);
    NPVariant prams[]={arg};
    newJSObject(instance,npnfuncs,"Foo",prams,sizeof(prams)/sizeof(prams[0]),jsFoo);

    NPVariant jsFoo2;
    NPVariant arg;
    DOUBLE_TO_NPVARIANT(3,arg);
    NPVariant prams[]={arg};
    newJSObject(instance,npnfuncs,"Foo",prams,sizeof(prams)/sizeof(prams[0]),jsFoo);

Но если мы вернем jsFoo1 и jsFoo2 в код JS, то мы вызываем Fooxxx.get ().И jsFoo1, и jsFoo2 - 3. Я знаю, что проблема в "конструкторе"

Может кто-нибудь дать мне другой метод создания объекта JS в C ++ с использованием NPAPI?

Ответы [ 2 ]

1 голос
/ 27 июля 2011

NPN_Construct, похоже, не работает с объектами браузера, поэтому нет прямого способа сделать то, что вы хотите. Однако вы можете создать функцию javascript для создания объекта и его возврата; Вы даже можете использовать NPN_Evaluate для автоматической вставки на страницу.

как то так:

function __create_object_2_params(obj, param1, param2) {
    return new obj(param1, param2);
}

FireBreath использует некоторые подобные приемы в некоторых местах.

1 голос
/ 27 июля 2011

Я не знаю, что не так с вашим кодом, но я знаю, что когда мне понадобился плагин NPAPI, следующие проекты сделали его действительно простым:

FireBreath - " фреймворк, позволяющий легко создавать мощные плагины для браузера "

nixysa - " Фреймворк генерации клеевого кода для плагинов NPAPI "

Оба проекта выполняют всю тяжелую работу за вас, поэтому вы можете создавать простые классы C ++ с одной стороны и легко использовать их как объекты JS с другой стороны. Если вы не слишком сильно вкладываете средства в NPAPI, я предлагаю вам попробовать. Может сэкономить много хлопот.

...