2012-04-26 12 views
10

私はこれを説明するように私と一緒に裸。ラップされたC++オブジェクトをJavascriptコールバックに渡すにはどうすればよいですか?

私はNode.jsモジュールをC++で記述しようとしています。このモジュールは、いくつかのクラスをラップして公開しています。libhdf5からです。

私は現在、libhdf5の2つのクラスに興味があります。最初のファイルはFileで、hdf5ファイルが開きます。 2番目のファイルはGroupで、そのファイル内のグループを表します。 FileオブジェクトからGroupオブジェクトを取得します。

私はFileオブジェクトを作成し、それからGroupを取得しようとするコードを書いています。できるだけJavascriptyとしてNode.jsモジュールを作成しようとしているので、コールバックを使用してグループを返す必要があります。それを

var hdf5 = require('hdf5'); 
var file = new hdf5.File('/tmp/example.h5'); 
file.getGroup('foobar', function (err, group) { console.log(group); }); 

ので、C++のコードで私のFileラッパーのために私はここにgetGroup関数にマップする機能を持っているだろう、と。だから、私は、それがこのように使われているように、私のモジュールをコーディングしようとしています指定された無名関数を呼び出して、エラーと同様に新しいGroupオブジェクトラッパーを渡します。

Node.jsのドキュメントに表示されているように、factory of wrapped objectsが表示されていることを考えれば、そこにある例の後にGroupというコードをモデル化しました。

私はGroupラッパーをコード化しましたが、インスタンス化しようとしていません。関数のパラメータにv8 Argumentsクラスを使用することからどのように離れていくかをまだ分かりません。そのため、v8の永続コンストラクタ関数に必要なパラメータを渡すことができないようです(JS-LandではなくC++からインスタンス化しているためです)。

誰かがmy code for libhdf5を見て、これを達成する方法について私に指摘してもらえますか?私はほとんどそこにいるように感じますが、私はちょうど何かを見逃しています。ここで

は、コンストラクタ関数で、私のGroupラッパーで強調表示:行は、私は引数として、私のパラメータを渡す必要があるだろうどこhightlighted(またはそれは私がする必要があるということです何でここhttps://github.com/ryancole/node-hdf5/blob/master/src/h5_group.cc#L57-72

は、私のFileラッパーです仕事に、このためにこれを変更:https://github.com/ryancole/node-hdf5/blob/master/src/h5_file.cc#L110

事前のおかげで、テキストのこの壁を読み取るための感謝を:)

答えて

9

あなたは、ほとんどがあります。 ArgumentsGroup::Instantiateに渡す必要はありません。必要なものを渡して、コンストラクタを使用してGroupという新しいインスタンスを作成してください。例:

Handle<Value> Group::Instantiate(const std::string& name) { 
    HandleScope scope; 

    Local<v8::Value> argv[1] = { 
     Local<v8::Value>::New(String::New(name.c_str())) 
    }; 

    return scope.Close(Constructor->NewInstance(1, argv)); 
} 

方法Group::Newは、残りの作業を行います。あなたがこれを行うことができますFile::OpenGroup

Handle<Value> Group::New(const Arguments& args) { 
    HandleScope scope; 

    if (!args[0]->IsString()) { 
     return ThrowException(Exception::TypeError(String::New("First argument must be a string"))); 
    } 
    const std::string name(*(String::Utf8Value(args[0]->ToString()))); 
    Group * const group = new Group(name); 
    bar->Wrap(args.This()); 

    return args.This(); 
} 

Handle<Value> File::OpenGroup (const Arguments& args) { 
    HandleScope scope; 

    if (args.Length() != 2 || !args[0]->IsString() || !args[1]->IsFunction()) { 
     ThrowException(Exception::SyntaxError(String::New("expected name, callback"))); 
     return scope.Close(Undefined()); 
    } 
    const std::string name(*(String::Utf8Value(args[0]->ToString()))); 
    Local<Function> callback = Local<Function>::Cast(args[1]); 

    const unsigned argc = 2; 
    Local<Value> argv[argc] = { 
     Local<Value>::New(Null()), 
     Local<Value>::New(Group::Instantiate(name)) 
    }; 
    callback->Call(Context::GetCurrent()->Global(), argc, argv); 

    return scope.Close(Undefined()); 
} 

HTH

+0

をそれはあなたが別のクラスのインスタンスを返すためにファクトリメソッド( '・グループ:: Instantiate')を必要とするということです? – ZachB

関連する問題