2015-09-07 60 views
2

我試圖將從JavaScript傳遞給Node.js插件的對象存儲在void *中。我似乎無法得到這個編譯;用node-gyp構建產生error: no matching function for call to 'Cast'在void *中檢索和存儲V8對象Node.js插件

我想要做的長版本是編寫一個運行Csound的Node.js插件。 Csound從鳥瞰角度出發,使用C函數,該函數將(通常)第一個參數作爲不透明Csound結構的指針。該結構包含void *到「hostData」,由Csound程序託管的任意數據。 Csound所做的一些事情,比如發佈消息,在這種情況下用回調函數指針進行修改。我需要一個地方爲Csound的每個實例存儲回調,因此我試圖讓某人將hostData設置爲來自JavaScript的對象,但我也希望將Csound實例的回調設置爲對象上的hidden properties

我覺得代碼需要看起來像

#include "csound.h" 

#include <node.h> 

static void CsoundMessageCallback(CSOUND *Csound, int attributes, 
    const char *format, va_list valist) 
{ 
    // Call the JavaScript function we stored in the hostData of Csound. 
} 

static void _wrap_csoundSetMessageCallback(
    const v8::FunctionCallbackInfo<v8::Value>& args) 
{ 
    v8::HandleScope scope(v8::Isolate::GetCurrent()); 

    CSOUND *Csound; 
    // Pretend we get the Csound instance from args[0] here. This is actually done 
    // by SWIG <http://www.swig.org>. 

    // This does not compile. csoundGetHostData() returns a void *, but I’m assuming 
    // hostData was set to an object from JavaScript. 
    v8::Persistent<v8::Object> hostData = 
    v8::Persistent<v8::Object>::Cast(csoundGetHostData(Csound)); 

    hostData.SetHiddenValue(
    v8::String::New("CsoundMessageCallback"), 
    v8::Persistent<v8::Function>::Cast(args[1]) 
); 
    csoundSetMessageCallback(Csound, CsoundMessageCallback); 
} 

我猜我需要在V8的內部領域的密切關注,但我真的不知道。

+0

只需發信號給主線程(例如使用'uv_async_send()')並從那裏執行JavaScript回調可能更安全。 – mscdex

+0

我同意,但我是否還需要存儲JavaScript中的回調?我的另一個想法是將Csound結構包裝在C++類中,並將回調函數存儲爲成員變量,但如果可以使用Csound的'void *''hostData',我想我也可以。 – Nate

回答

2

通常我在這種情況下所做的是我編寫一個包裝器C++類(繼承自節點的ObjectWrap類),它存儲了一個指向我包裝的任何C/C++類的實例的指針,並具有各種公共方法與該實例進行交互。

當從JS land中調用new時,會創建一個新的包裝器C++類實例並將其與新的JS對象關聯。然後你有JS函數啓動任何利用包裝庫回調的異步任務。

從那裏它只是從包裝庫的回調調用uv_async_send()來發信號通知主線程,然後從uv_async回調調用JS回調。

你可以看到這一切here(尤其是在Windows的特定部分)的一個例子:

就存儲JS回調而言,有不同的方法來處理它。一種解決方案可能是創建一個接力棒對象,該對象存儲JS回調的持久副本和包裝類實例,並將該接力棒存儲在uv_async_t的用戶數據指針中。這意味着要爲每個請求創建一個新的uv_async_t(這與上面給出的示例不同)。

相關問題