谷歌:CEF3中,c++调用JS的返回值获取问题?

在谷歌的Chromium Embedded Framework(CEF3)中,如果你希望在C++中调用JavaScript并获取返回值,通常可以通过以下步骤实现:

1. 注册自定义的 JavaScript 扩展

首先,需要注册一个自定义的 JavaScript 扩展,使得你可以在 JavaScript 中调用你提供的函数,并在 C++ 中处理这些调用。CEF提供了 CefV8Handler 接口来处理 JavaScript 到 C++ 的调用。

cpp
class MyV8Handler : public CefV8Handler { public: MyV8Handler() {} // 处理 JavaScript 调用的方法 bool Execute(const CefString& name, CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments, CefRefPtr<CefV8Value>& retval, CefString& exception) override { if (name == "myFunction") { // 在这里处理函数调用逻辑,可以调用其他 C++ 函数并返回结果 // 示例:返回一个字符串 retval = CefV8Value::CreateString("Hello from C++"); return true; } return false; } IMPLEMENT_REFCOUNTING(MyV8Handler); };

2. 注册 JavaScript 扩展

在创建 CEF 的 CefApp 实现中,注册你的 MyV8Handler,使其在 JavaScript 环境中可用。

cpp
class MyApp : public CefApp, public CefRenderProcessHandler { public: // 省略其他方法... // 注册 V8 扩展 void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) override { CefRefPtr<CefV8Value> global = context->GetGlobal(); CefRefPtr<MyV8Handler> handler = new MyV8Handler(); // 注册一个名为 myFunction 的 JavaScript 函数 CefRefPtr<CefV8Value> func = CefV8Value::CreateFunction("myFunction", handler); global->SetValue("myFunction", func, V8_PROPERTY_ATTRIBUTE_NONE); } IMPLEMENT_REFCOUNTING(MyApp); };

3. 在 C++ 中调用 JavaScript 函数并获取返回值

在需要调用 JavaScript 并获取返回值的地方,可以使用 CEF 的 ExecuteJavaScript 方法来执行 JavaScript 代码,并通过 CefV8Value 对象获取返回值。

cpp
// 获取当前活动的浏览器窗口 CefRefPtr<CefBrowser> browser = ...; // 通过某种方式获取 CefRefPtr<CefFrame> frame = browser->GetMainFrame(); // 执行 JavaScript 代码并获取返回值 CefRefPtr<CefV8Value> retval; CefRefPtr<CefV8Exception> exception; bool success = frame->ExecuteJavaScript("myFunction()", frame->GetURL(), 0, retval, exception); if (success && retval.get() && retval->IsString()) { // 如果成功执行且返回值是字符串类型,可以获取字符串值 CefString result = retval->GetStringValue(); // 使用 result 做进一步处理 } else { // 处理执行失败或返回值不符合预期的情况 }

解释说明

  • 注册自定义 JavaScript 扩展:通过实现 CefV8Handler 接口处理 JavaScript 到 C++ 的调用,可以在 C++ 中定义要供 JavaScript 调用的函数。

  • 注册 JavaScript 扩展:在 OnContextCreated 方法中注册你的 MyV8Handler,以便在 JavaScript 环境中能够调用定义的函数。

  • 调用 JavaScript 函数并获取返回值:使用 ExecuteJavaScript 方法执行 JavaScript 代码,并通过 CefV8Value 获取执行的返回值。

通过以上步骤,你可以在 C++ 中使用 CEF3 调用 JavaScript 函数并获取返回值,实现了跨语言的交互操作。