通过C&x2B+;对象到C++;Nodejs/V8扩展中通过Javascript实现的函数

通过C&x2B+;对象到C++;Nodejs/V8扩展中通过Javascript实现的函数,javascript,c++,node.js,v8,cvv8,Javascript,C++,Node.js,V8,Cvv8,我试图包装一个C++函数,它将一个对象作为输入,以便通过NoDEJS访问。这里有一个简单的例子来说明我正在尝试做什么 在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 在Javascr

我试图包装一个C++函数,它将一个对象作为输入,以便通过NoDEJS访问。这里有一个简单的例子来说明我正在尝试做什么

在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);
<>所有我发现的NoDEJS C++插件例子都是用简单的数据类型和非常简单的例子来处理的。这样做有什么好的例子或模式吗?由于缺少v8文档和制作插件的繁琐/冗长语法,我自己在这方面运气不太好

需要,

  • 在JavaScript
  • 中创建C++对象的能力
  • 能够通过Javascript将这些对象传递给需要它们的方法或静态函数

也有什么比V8 Cuff/CV8更简单的方法来简化C++库的过程,以便通过节点.js?

< p>访问。这取决于你使用的浏览器,但是大多数C++和JavaScript之间的互操作是通过COM来实现的。

< P> <强>节点画布< /强> 在TJ HooWayZuk中,在C++中显示了对象包装实例,以在JavaScript方面传递和使用。 我将在下面摘录一个例子与您分享它是如何完成的

来自


有关ObjectWrap的解释,请参见。

Node.js是一个服务器端JavaScript环境,与浏览器无关。可以像boost.python一样使用boost.js。你可以用SWIG来做。有些人似乎喜欢SWIG,但我更喜欢boostpython中的控件。
class Image: public node::ObjectWrap {
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();
}
class Canvas: public node::ObjectWrap {
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();
}
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;
}