2011-07-27 14 views
0

NPAPIプラグインを作成しています。 C++コードでは、NPAPIを使用してJSオブジェクトを作成することはできません。 C++コード(私はFooのオブジェクトを作成したいだけで、我々はJSで何ができるかリンクNPAPIを使用して新しいJSオブジェクトを作成する方法は?

function Foo(p) 
{ 

    this.a=p; 
} 

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

foo.jsは

VAR S =新しいは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); 

しかし、我々はJSコードにjsFoo1とjsFoo2を返す場合、我々は)(Fooxxx.getを呼び出します。 jsFoo1とjsFoo2の両方が、私は問題は「コンストラクタ」

は誰もが私に別の方法NPAPIを使用してC++でJSオブジェクトを作成を与えることができますか?知っている3 ですか

答えて

1

NPN_Constructはブラウザオブジェクトでは機能していないようですので、直接行う方法はありません。しかし、あなたができることは、オブジェクトを作成して返すためのjavascript関数を作成することです。自動的にNPN_Evaluateを使ってページに自動的に挿入することもできます。このような

何か:

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

FireBreathは場所では、いくつかの同様のトリックを使用しています。

+1

NPN_Evaluateを使用してスクリプトを挿入すると、それはありがたいです。私はFireBreathのソースコードを読んでいます。 – greatsea

1

私はあなたのコードが悪いのか分からないが、私はNPAPIプラグインを必要なときに、次のプロジェクトは、それは本当に簡単に作られていることを知っていますか:

FireBreath - 「簡単に作成できるフレームワークを強力なブラウザプラグイン

nixysa - 」NPAPIプラグイン "のためのグルーコード生成フレームワーク

あなたは、単純なCを作成することができるように両方のプロジェクトは、あなたのためのすべてのハードワークを行う++片方のクラスを作成し、もう一方のJSオブジェクトとして簡単に使用できます。あなたがNPAPIのものに多すぎる投資をしていないなら、あなたはそれらを試してみることをお勧めします。あなたに多くの面倒を節約できました。

+1

ありがとう、私はFireBreathのソースコードをダウンロードしています。正直言って、FireBreathはとても素晴らしいです。 – greatsea

+0

喜んでそれを好き;-)私はそれに熱心に取り組んだ – taxilian

関連する問題