cef中js调用c++接口函数
·
如果javascript想要调用c++的代码,那么需要在c++中将代码暴露给javascript,JavaScript直接调用就可以了,暴露的需要两个类CefV8Handler 和CefRenderProcessHandler ,CefV8Handler 是当js调用c++函数时的处理逻辑。CefRenderProcessHandler 是注册c++和js函数中间的对应关系。
C++ 调用 JavaScript 与 JavaScript 调用 C++ 的交互
-
JavaScript 调用 C++:
- 当 JavaScript 调用 C++ 函数 时,C++ 需要暴露函数或方法到 JavaScript 中。这样,JavaScript 就可以通过调用暴露的 C++ 函数来与本地代码交互。
- 为了实现这一点,C++ 使用
CefV8Handler来处理 JavaScript 函数的调用,而CefRenderProcessHandler用于将这些 JavaScript 函数注册到 渲染进程 中。
1. CefV8Handler:处理 JavaScript 调用 C++ 函数 的逻辑
CefV8Handler 是一个接口类,用于在 JavaScript 执行时处理 JavaScript 调用 C++ 函数 的逻辑。
- 通过实现
CefV8Handler::Execute()方法,可以定义 C++ 方法的行为,特别是当 JavaScript 调用暴露的 C++ 函数时,如何处理该调用。
关键点:
CefV8Handler的Execute()方法负责处理 JavaScript 的调用。你可以根据调用的函数名 (name) 来决定调用哪个 C++ 函数。Execute()方法会返回CefV8Value类型的结果,表示 C++ 方法的执行结果。这些结果会传递回 JavaScript。
示例:
class MyV8Handler : public CefV8Handler {
public:
virtual bool Execute(const CefString& name, CefRefPtr<CefV8Value> arguments,
CefRefPtr<CefV8Value>& retval, CefString& exception) override {
if (name == "callNative") {
// JavaScript 调用 C++ 的函数,执行本地逻辑
MessageBox(NULL, L"JavaScript 调用了 C++ 函数!", L"Info", MB_OK);
retval = CefV8Value::CreateString("Native function called successfully");
return true;
}
return false; // 如果调用的不是"callNative",返回 false
}
};
- 这个示例中,当 JavaScript 调用
callNative时,C++ 方法被触发,显示消息框,并返回一个字符串"Native function called successfully"。
2. CefRenderProcessHandler:注册 C++ 和 JavaScript 函数的对应关系
CefRenderProcessHandler 是 渲染进程中的处理器,它的作用是注册 C++ 中的方法和 JavaScript 中的方法之间的对应关系。换句话说,它将 CefV8Handler 创建的 C++ 函数绑定到 JavaScript 环境中。
CefRenderProcessHandler在渲染进程中创建,并在OnContextCreated中注入 C++ 方法,向 JavaScript 暴露这些方法。
关键点:
CefRenderProcessHandler主要负责将 C++ 中的方法暴露给 JavaScript,它通过OnContextCreated回调来注入CefV8Handler。- 它注册了 C++ 函数,以便 JavaScript 可以通过
window对象访问这些函数。
示例:
class MyRenderProcessHandler : public CefRenderProcessHandler {
public:
virtual void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) override {
// 在渲染进程中创建并暴露 "callNative" 函数
CefRefPtr<CefV8Value> callNativeFunc = CefV8Value::CreateFunction("callNative", new MyV8Handler());
context->GetGlobal()->SetValue("callNative", callNativeFunc, V8_PROPERTY_ATTRIBUTE_NONE);
}
};
OnContextCreated回调会在渲染进程的上下文创建时触发。- 在此回调中,
MyV8Handler被实例化并暴露为callNative函数,供 JavaScript 使用。
3. 双向交互的整体工作流程
-
C++ 向 JavaScript 暴露函数:
- 在
CefRenderProcessHandler::OnContextCreated中,使用CefV8Value::CreateFunction创建一个 C++ 函数,并将其绑定到 JavaScript 上下文的全局对象中。这样,JavaScript 就可以调用该 C++ 函数。
- 在
-
JavaScript 调用 C++ 函数:
- 在 JavaScript 代码中,你可以直接调用
callNative(),这将触发 C++ 中的MyV8Handler::Execute()方法,并执行本地逻辑。
- 在 JavaScript 代码中,你可以直接调用
-
C++ 调用 JavaScript:
- 如果 C++ 需要执行 JavaScript 代码(例如动态执行某个脚本),可以使用
CefFrame::ExecuteJavaScript来运行 JavaScript 代码。
- 如果 C++ 需要执行 JavaScript 代码(例如动态执行某个脚本),可以使用
C++ 调用 JavaScript 示例:
CefRefPtr<CefFrame> frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('Hello from C++');", frame->GetURL(), 0);
这个代码将在页面中执行 JavaScript alert(),并显示一条消息 "Hello from C++"。
4. 何时使用 CefRenderProcessHandler 和 CefV8Handler
CefV8Handler:你需要实现它来处理从 JavaScript 调用 C++ 函数的逻辑。它是 C++ 与 JavaScript 之间交互的 “处理器”。CefRenderProcessHandler:你需要实现它来注册和管理 C++ 和 JavaScript 函数之间的绑定关系。它主要通过OnContextCreated来将 C++ 函数暴露给 JavaScript。
总结
CefV8Handler用于处理 JavaScript 调用 C++ 函数的逻辑。CefRenderProcessHandler用于注册和暴露 C++ 函数,使得 JavaScript 可以调用这些函数。- 通过这些机制,C++ 和 JavaScript 可以 双向交互,C++ 可以调用 JavaScript,JavaScript 也可以调用 C++ 函数。
更多推荐


所有评论(0)