将 class 实例函数绑定到 v8::FunctionTemplate

Bind class instance function to v8::FunctionTemplate

总的来说,我对 C++ 和 v8 还很陌生,我想构建一个原生 node.js 插件,但现在我被困在一些非常简单的 IMO 上,但我想不通问题是什么,错误消息

C:\Path\To\Project\File.cpp(50): error C2664: 'v8::Local<v8::FunctionTemplate> v8::FunctionTemplate::New(v8::Isolate *,v8::FunctionCallback,v8::Local<v8::Value>,v8::Local<v8::Signature>,int,v8::ConstructorBehavior,v8::SideEffectType)': cannot convert argument 2 from 'v8::Local<v8::Value> (__cdecl *)(const v8::FunctionCallbackInfo<v8::Value> &)' to 'v8::FunctionCallback' [C:\Path\To\Project\build\node_gui.vcxproj]

没有太大帮助。

我有以下代码,

v8::Local <v8::Object> Window::GetFunctions() {
    v8::Local <v8::Object> DrawFunctions = v8::Object::New(isolate);


    v8::Local <v8::FunctionTemplate> bgfnc = v8::FunctionTemplate::New(isolate, &Window::BackgroundCB);

    DrawFunctions->Set(v8::String::NewFromUtf8(isolate, "background"), bgfnc);

    return DrawFunctions;
}

void Window::Background(const v8::FunctionCallbackInfo <v8::Value> &args) {
    v8::Isolate *isolate = args.GetIsolate();
    renderer->Background(args[0]->NumberValue(), args[1]->NumberValue(), args[2]->NumberValue());
}

v8::Handle <v8::Value> BackgroundCB(const v8::FunctionCallbackInfo <v8::Value> &args) {
    return ((Window*)v8::External::Cast(*(args.Data())->Value())->Background());
}

我想创建一个包含函数列表的对象,函数的回调将是 Window class 的成员函数。我知道在 here 之前有人问过这个问题,它曾使用非成员函数工作过一次,但在其他情况下没有。

谢谢

旁注:我已经广泛寻找适合初学者的 v8 文档,nodesource 的文档没有解释参数的含义,也很少给出完整的示例如何使用函数 / class,如果有人知道一些更好的文档,那就太好了,谢谢。

感谢社区的慷慨和及时的帮助,我能够快速而轻松地解决这个问题。事实证明,在编写 NodeJS 插件时,使用 NodeJS's own N-API 是个好主意,因为文档更简单、更清晰,最重要的是,存在。