2013-03-04 84 views
3

我希望能够实例化C++类的实例并将其作为参数传递给JavaScript回调。该类继承自ObjectWrap,可用于Node.js并在其中使用。实例化并将C++对象传递给Node.js函数V8

如果上述实例来自JavaScript,我可以将同一类的实例传递给回调函数。

这是什么,我需要做一个基本的例子:

MyClass *instance = new MyClass(); 

// If was passed as the first param to this method, commit is set as below, this code works. 
// MyClass *instance = ObjectWrap::Unwrap<MyClass>(args[0]->ToObject()); 

// Assign some property values to commit 
Handle<Value> argv[] = { instance->handle_ }; 
ar->callback->Call(Context::GetCurrent()->Global(), 1, argv); 

这不起作用,而是出现segfaults。 gdb告诉我:

Program received signal EXC_BAD_ACCESS, Could not access memory. 

我会如何修改我的代码,让我通过我的instance回调?


更新commit.cc:有问题的类可以在Github上查看。

+0

你为什么试图通过全班?当然,你可以找到一个更清洁的方式来进行节点和C++之间的通信? 也许你可以设计你的项目,以便C++程序输出你需要的数据到标准输入,你的js程序从标准输入中得到它。 – Plato 2013-03-04 14:08:32

+2

因为模块包装库的功能。你所建议的不是一种选择。 – 2013-03-04 18:38:52

+1

你应该使用MyClass :: New从C++实例化你可能定义为构造函数的对象。否则,您的句柄引用不会启动。 – Floby 2013-03-04 19:28:40

回答

2

答案是我做错了。

正确的代码:

Local<Value> instance = MyClass::constructor_template->NewInstance(); 

// Assign some property values to commit 
Handle<Value> argv[] = { instance }; 
ar->callback->Call(Context::GetCurrent()->Global(), 1, argv); 

要获得MyClass实例:

MyClass *instanceOfMyClass = ObjectWrap::Unwrap(instance);