在V8中创建自定义JavaScript函数?

时间:2017-11-05 16:06:24

标签: javascript c++ v8

我试图在我的项目中嵌入一个使用V8引擎的自定义功能,显然我无法使其正常工作。我已经使用了代码,我已经找到了,但它似乎已经过时了,或者我只是做错了。我的观点是包含一个自定义的javascript文件。我目前的代码(用于测试)是:

    HandleScope handle_scope(isolate);

    v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
    global->Set(v8::String::NewFromUtf8(isolate, "test", v8::NewStringType::kNormal).ToLocalChecked(),
        v8::FunctionTemplate::New(isolate, test));

    Handle<Context> context = Context::New(isolate);
    Persistent<Context> persistent_context(isolate, context);

    Context::Scope context_scope(context);
    const char* data = "test";
    Handle<String> source = String::NewFromUtf8(isolate, data);

    Handle<Script> script = Script::Compile(source);
    if (!script.IsEmpty())
        Handle<Value> result = script->Run();

测试代码(显然仅用于测试):

void test(const v8::FunctionCallbackInfo<v8::Value>& args) {
    MessageBoxA(NULL,"test", "", 0);
}

但引擎会返回此错误:

Uncaught ReferenceError: test is not defined

所以我的问题是,如果我做得正确,我可以自己制作包括我希望,但我不能让这个功能得到执行。

1 个答案:

答案 0 :(得分:2)

这是一个有效项目的代码:

Isolate::Scope iscope( isolate_ );
HandleScope hs( isolate_ );


Local<Object> test = Object::New(isolate_);
test->Set(String::NewFromUtf8(isolate_, "javaScriptFunctionName"), Function::New(isolate_, CPP_FN_CALLBACK));
global_template->Set(String::NewFromUtf8(isolate_, "test"), test);

这将导致window.test的对象具有名为window.test.javaScriptFunctionName()

的函数