10

libhdf5からいくつかのクラスをラップして公開する、C++ を使用して Node.js モジュールを作成しようとしています。

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

Fileオブジェクトを作成し、そこから を取得しようとするコードをいくつか書きましGroupた。Node.js モジュールをできるだけ JavaScripty にしようとしているので、コールバックを使用してグループを返したいと考えています。したがって、次のように使用されるようにモジュールをコーディングしようとしています。

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 のドキュメントがラップされたオブジェクトのファクトリであるGroupと示しているように思えたので、そこにある例に従ってコードをモデル化しました。

そのため、Groupラッパーをコーディングしましたが、インスタンス化しようとして立ち往生しています。Arguments関数パラメーターに v8 クラスを使用しないようにする方法を知るには、まだ十分な知識がありません。そのため、v8 永続コンストラクター関数に必要ないくつかのパラメーターを渡すことができないようです (これは、JS ランドではなく C++ からインスタンス化しているためです)。

4

1 に答える 1

9

もうすぐです。Argumentsに渡す必要はありませんGroup::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は、残りの建設作業を行います。

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();
}

File::OpenGroupあなたはこれを行うことができます:

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());
}
于 2012-04-27T05:32:02.397 に答える