Cef功能开发经验总结(5)

2020-02-22 11:11

message->GetArgumentList()->SetString(1, param);

browser->SendProcessMessage(PID_BROWSER, message);

retval = CefV8Value::CreateBool(true); } }

return true; }

// Function does not exist. return false; }

在这里可以获取到JS要调用的函数名,以及传入的参数等信息。获取到这些信息后,把他们包装为

CefProcessMessage结构,通过IPC把信息发送到Browser进程进行异步处理。调用SendProcessMessage方法把信息发送到Browser进程

浏览器进程的CefClient::OnProcessMessageReceived方法接收到Render进程发来的消息。Browser进程处理消息后,可以通过C++调用JS的方法去通知Web端消息处理结果

进程结束的流程 在

https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_Close.md里有完整的Cef结束流程分析和处理代码,不过由于我们的项目不单单只有Cef组件,而且使用场景和Cef Demo中的不一样,所以采用了不同的关闭流程

CefControl控件的销毁流程

在CefControl控件的析构函数里调用CloseBrowser(true)方法通知浏览器对象要关闭BrowserHandler::DoClose接口被触发,这里不需要做额外处理,直接返回就可以之后BrowserHandler::OnBeforeClose接口被触发,在这里一定要释放所有对CefBrowser对象的引用,否则会导致程序无法退出。

进程退出流程

用户单击右下角托盘的退出菜单项触发到

LoginCallback::DoLogout函数,在这里会调用到代码nim_comp::

WindowsManager::GetInstance()->DestroyAllWindows();,这里销毁所有的窗体,所有控件被销毁,自然就会触发所有CefControl控件的销毁流程,所有浏览器对象被关闭LoginCallback::DoLogout函数里之后会调用到UILogoutCallback函数,这里原本会调用

PostQuitMessage(0)函数结束消息循环,但是我们应该等待所有浏览器对象关闭后在结束消息循环,否则会发生错误。而CefBrowser的关闭是异步的,所以无法保证调用UILogoutCallback函数时所有CefBrowser被关闭我在CefManager类实现PostQuitMessage函数,在这里等待所有CefBrowser关闭后再结束消息循环程序正常结束

CefManager::PostQuitMessage函数里判断当前浏览器对象的数量来决定是否退出消息循环,如果还有浏览器对象没有关闭就等待500毫秒后再检测:

void CefManager::PostQuitMessage(int nExitCode) {

if (browser_count_ == 0)

{

Post2UI([nExitCode]() {

::PostQuitMessage(nExitCode); }); } else {

auto cb = [nExitCode]() {

CefManager::GetInstance()->PostQuitMessage(nExitCode); };

nbase::ThreadManager::PostDelayedTask(kThreadUI, cb, nbase::TimeDelta::FromMilliseconds(500)); } }

把Cef组件集成到云信NIM项目

把tool_kits\\cef目录中写好的Cef模块组件拷贝到自己项目的对应目录,并且添加到解决方案中。其中cef_render项目是Cef渲染子进程,是一个独立的exe;libcef_dll_wrapper项目是Cef导出的C语言接口的C++包装类;cef_module项目是核心封装代码,把cef功能封装为可以在nim demo中直接使用的类,其中包含了对cef功能进行管理的CefManager和CefControl、CefNativeControl两个控件等。把nim_win_demo\\gui\\cef目录的源文件拷贝都自己项目的某个目录,这里面CefControl、CefNativeControl两个控件的测试窗口代码,可有可无进入libs目录,解压cef_sandbox.rar压缩包并把cef_sandbox.lib、

cef_sandbox_d.lib文件放到libs目录;进入libs\\x64目录,解压cef_sandbox.rar压缩包并把cef_sandbox.lib、cef_sandbox_d.lib文件放到libs\\x64目录。这里面是编译cef组件时,为cef模块增加sandbox功能的静态库。bin\\cef目录是cef模块依赖的cef相关dll。主程序初始化时会从bin\\cef目录加载cef所需dll配置nim_demo项目属性,在链接器\\输入\\延迟加载的DLL中加入

libcef.dll;libEGL.dll;libGLESv2.dll(因为我们把cef所需的dll都放到bin\\cef目录了,这样不会导致目录混乱,但是为了顺利加载cef dll,需要延迟加载;如果不想用延迟加载,就把


Cef功能开发经验总结(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:甬教研2008110号

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: