如何使用NPAPI创建新的JS对象?

时间:2011-07-27 01:40:30

标签: javascript c++ npapi

我正在编写NPAPI插件。在C ++代码中,我无法使用NPAPI创建JS对象。我试过这个方法:

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。 我知道问题是"构造函数"

任何人都可以使用NPAPI在C ++中创建另一个创建JS对象的方法吗?

2 个答案:

答案 0 :(得分:1)

我不知道您的代码有什么问题,但我知道当我需要NPAPI插件时,以下项目让它变得非常简单:

FireBreath - “一个允许轻松创建功能强大的浏览器插件的框架

nixysa - “ NPAPI插件的胶水代码生成框架

两个项目都为您完成了所有艰苦的工作,因此您可以在一侧创建简单的C ++类,并在另一侧轻松地将它们用作JS对象。如果你对NPAPI的投入不是太多,我建议你试一试。可以为你节省很多麻烦。

答案 1 :(得分:1)

NPN_Construct似乎不适用于浏览器对象,因此没有直接的方法可以执行您想要的操作。但是,你可以做的是制作一个javascript函数来为你创建对象并将其返回;您甚至可以使用NPN_Evaluate将其自动注入页面。

类似的东西:

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

FireBreath在某些地方使用了类似的技巧。