我試圖將從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的內部領域的密切關注,但我真的不知道。
只需發信號給主線程(例如使用'uv_async_send()')並從那裏執行JavaScript回調可能更安全。 – mscdex
我同意,但我是否還需要存儲JavaScript中的回調?我的另一個想法是將Csound結構包裝在C++類中,並將回調函數存儲爲成員變量,但如果可以使用Csound的'void *''hostData',我想我也可以。 – Nate