2013-03-04 118 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);