我正在尝试将从 JavaScript 传递到 Node.js 插件的对象存储在void *
. 我似乎无法编译它;使用 node-gyp 构建会产生error: no matching function for call to 'Cast'
.
我正在尝试做的长版本是编写一个运行 Csound 的 Node.js 插件。从鸟瞰的角度来看,Csound 使用 C 函数工作,该函数将指向不透明 Csound 结构的指针作为(通常)第一个参数。这个结构包含一个void *
“<code>hostData”,由托管 Csound 的程序设置的任意数据。Csound 所做的一些事情,比如发布消息,是用回调修改的——在这种情况下是函数指针。我需要一个地方来存储每个 Csound 实例的回调,所以我试图让某人hostData
从 JavaScript 中设置一个对象,但我还想将 Csound 实例的回调设置为该对象的隐藏属性hostData
。
我认为代码需要看起来像
#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 的内部字段,但我真的不确定。