4

Nodejsを介してアクセスできるように、オブジェクトを入力として受け取るC++関数をラップしようとしています。これは、私がやろうとしていることを示す簡単な例です。

C++で仮定します。

struct query {
  string m_foo;
  string m_bar;

  query(string foo, string bar)
   :m_foo(foo), m_bar(bar) {}
}

static string ExecuteQuery(query q); // Implemented somewhere

Javascript(node.js)でできるようにしたいのですが、

 var q = new plugin.query("foo", "bar");
 var result = plugin.ExecuteQuery(q);

私が見つけたnodejsC++プラグインの例はすべて、単純なデータ型とかなり些細な例で動作しています。このようなことをするための良い例やパターンはありますか?v8のドキュメントがなく、プラグインを作成するための面倒で冗長な構文がないため、私はこれを自分で行うことができませんでした。

必要、

  • JavascriptでC++オブジェクトを作成する機能
  • これらのオブジェクトを、Javascriptを介してそれらを必要とするメソッドまたは静的関数に渡す機能

また、node.jsを介してアクセスできるようにC ++ライブラリをラップするプロセスを簡素化しようとするために、v8-juice / cvv8よりも優れたものはありますか?

4

2 に答える 2

2

node-canvas node-canvas で、TJ Holowaychuk はオブジェクト ラッピングの例を C++ で示し、JavaScript 側で渡して使用するという素晴らしい仕事をしました。

以下に例を 1 つ抜粋して、その方法を紹介します。

Image.hから

class Image: public node::ObjectWrap {

Image.ccから

Persistent<FunctionTemplate> Image::constructor;
...
Handle<Value>
Image::New(const Arguments &args) {
  HandleScope scope;
  Image *img = new Image;
  img->data_mode = DATA_IMAGE;
  img->Wrap(args.This());
  return args.This();
}

もう 1 つの例はCanvasオブジェクトです。

class Canvas: public node::ObjectWrap {

そしてCanvas.ccから

Handle<Value>
Canvas::New(const Arguments &args) {
  HandleScope scope;
  int width = 0, height = 0;
  canvas_type_t type = CANVAS_TYPE_IMAGE;
  if (args[0]->IsNumber()) width = args[0]->Uint32Value();
  if (args[1]->IsNumber()) height = args[1]->Uint32Value();
  if (args[2]->IsString()) type = !strcmp("pdf", *String::AsciiValue(args[2]))
    ? CANVAS_TYPE_PDF
    : CANVAS_TYPE_IMAGE;
  Canvas *canvas = new Canvas(width, height, type);
  canvas->Wrap(args.This());
  return args.This();
}

node-canvas モジュールが必要になると、他の JavaScript オブジェクトと同じように簡単にアクセスできます。

fs.readFile(__dirname + '/someFile.jpg', function(err, image_data){
  var Canvas      = require('canvas');  
  var Image       = Canvas.Image;
  var img = new Image;
  img.onload = function() {
    var canvas = new Canvas(img.width,img.height);
    var ctx = canvas.getContext('2d');
    // grab and modify pixel data etc
  }
  img.src = image_data;
}

ObjectWrap の説明については、nodejs addon docsを参照してください。

于 2013-01-18T18:37:08.617 に答える
-8

使用しているブラウザによって異なりますが、ほとんどの場合、C++ と JavaScript の間の相互運用は COM を介して行われます。

于 2012-09-28T00:42:20.963 に答える