Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用NPAPI创建新的JS对象?_Javascript_C++_Npapi - Fatal编程技术网

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

Javascript 如何使用NPAPI创建新的JS对象?,javascript,c++,npapi,Javascript,C++,Npapi,我正在写一个NPAPI插件。在C++代码中,我不能使用NPAPI创建JS对象。我试过这个方法: Foo.js C++代码(我想创建Foo对象。只需链接我们在JS.var s=new Foo(2);)中可以做的事情即可) 但是如果我们将jsFoo1和jsFoo2返回到JS代码,那么我们将调用Fooxxx.get()。jsFoo1和jsFoo2都是3。 我知道问题出在“构造函数” P>我可以不知道用C++来创建JS对象的方法是什么?用NAPAPI?< /P> < P>我不知道代码有什么问题,但是我

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

Foo.js

C++代码(我想创建Foo对象。只需链接我们在JS.var s=new Foo(2);)中可以做的事情即可)

但是如果我们将jsFoo1和jsFoo2返回到JS代码,那么我们将调用Fooxxx.get()。jsFoo1和jsFoo2都是3。 我知道问题出在“构造函数”


<> P>我可以不知道用C++来创建JS对象的方法是什么?用NAPAPI?< /P> < P>我不知道代码有什么问题,但是我知道当我需要NAPAPI插件时,下面的项目使它变得非常容易:

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

-“NPAPI插件的粘合代码生成框架”


两个项目都为你做了所有的工作,所以你可以一边创建简单的C++类,一边轻松地将它们作为JS对象使用。如果你对NPAPI的投资不是太大,我建议你试试。可以为您节省很多麻烦。

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

大概是这样的:

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

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

谢谢,我刚刚下载了FireBreath的源代码。说实话,FireBreath非常棒。使用NPN_Evaluate注入脚本,就这样,谢谢。我正在读FireBreath的源代码,你的回复救了我。。。
    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);
function __create_object_2_params(obj, param1, param2) {
    return new obj(param1, param2);
}