基于CEF开发时经常需要在JS和C++代码间通信,我们在CEF中JavaScript与C++交互中讨论了常见的交互方式,不过都是在Renderer进程中,这次来看看如何在JS和Browser进程间通信,基本介绍可以看这里:
https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-asynchronous-javascript-bindings。
具体做法,上面给出的链接里有大概说明,另外在cef_message_router.h中有详细说明,它分了9步,有需要的可以去查看。我试验了下可行。按照我的实验,从三个方面来说说:
- browser进程
- renderer进程
- html中的js
foruok原创,转载请关注微信订阅号“程序视界”联系foruok。
browser进程
- 1)配置browser进程这一侧的Message Router
使用CefMessageRouterConfig来定义可以在html中使用的方法名字。代码片段可能如下:
...
CefMessageRouterConfig g_messageRouterConfig;
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// Enable High-DPI support on Windows 7 or newer.
CefEnableHighDPISupport();
g_messageRouterConfig.js_query_function = "cefQuery";
g_messageRouterConfig.js_cancel_function = "cefQueryCancel";
CefMainArgs main_args(hInstance);
...
}
注意我在main函数之外定义了一个CefMessageRouterConfig的实例,然后在main函数中设置了query和cancel这两个函数。它们定义了可以在html的js代码里使用的方法,比如根据上面代码,你可以用window.cefQuery({…})。
- 2)创建CefMessageRouterBrowserSide的实例
browser进程这边需要一个CefMessageRouterBrowserSide的实例来处理renderer进程发过来的消息。建议把这个实例作为成员变量放在CefClient的派生类中,因为它CefMessageRouterBrowserSide定义了一些方法,需要在指定的地方调用。
声明和初始化的代码片段:
CefRefPtr<CefMessageRouterBrowserSide> m_browser_side_router;
...
extern CefMessageRouterConfig g_messageRouterConfig;
m_browser_side_rou