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

2020-02-22 11:11

bin\\cef目录的dll都直接放到bin目录)

WinMain函数中第一句加入(用于延迟加载cef dll,如果不延迟加载,则不需要这句) nim_ui::

InitManager::GetInstance()->AddCefDllToPath(); 在开始云信组件初始化之前加入如下代码用于初始化cef功能(一定要在云信组件初始化之前)

if (!nim_cef::CefManager::GetInstance()->Initialize(true) return 0;

在开始UI线程消息循环之后加入如下代码用于清理cef功能 nim_ui::InitManager::GetInstance()->CleanupUiKit();

找到原项目中调用::PostQuitMessage函数的地方,修改为nim_cef::

CefManager::GetInstance()->PostQuitMessage(0); 其他配置如果有疑问可以参见Cef Nim Demo的配置

让Cef支持Flash、mp3、mp4

现在附带的nim demo中使用的cef相关dll是专门下载了

cef源码增加mp3、mp4功能后重新编译的(在Windows下编译Cef3.2623并加入mp3、mp4支持(附带源码包和最终DLL) )。所以如果使用我提供的dll,可以直接支持mp3、mp4播放(官方直接下载的cef不支持)。如果对cef功能有其他需求的话请自行下载编译cef并替换demo中的dll

demo中附带的dll都是release版本,没有附带debug版本

cef_module项目中已经默认支持flash播放,

bin\\cef\\PepperFlash目录中附带了支持flash播放所需的dll,如果不需要flash功能,可以删除这个目录

cef_module项目中提供了两个控件来展示cef浏览器,分别为CefControl、CefNativeControl,CefControl用于离屏渲染模式,CefNativeControl用于真窗口模式,根据需求来选择使用这两个控件的一个。离屏渲染模式的话控件自己控制浏览器的渲染,所以可以与nim duilib结合的更完美,支持透明异形窗体;真窗口模式因为Cef需要依托一个子窗口,由Cef自己渲染,所以无法支持透明异形窗体。对于绝大多数需求,使用离屏渲染模式的CefControl更好,因为与duilib结合更完美。但是如果网页的内容刷新非常频繁(尤其是用

于播放Flash时),应该使用真窗口模式,否则Flash播放导致的频繁绘制操作会让程序的CPU占用率飙升!

我们的代码默认是开启离屏渲染模式的,如果有播放Flash的需求或者其他浏览器画面频繁的需求时,应该关闭离屏渲染模式而使用真窗口模式,关于方法时Winmain函数中初始化cef功能时参数传入false,nim_cef::

CefManager::GetInstance()->Initialize(false)。另外我们的duilib窗口默认是使用支持透明异形的分层窗口,是不支持子窗口的,所以如果使用cef的真窗口模式,那么应该关闭duilib窗口的分层窗口样式,关闭方法是创建窗口的Window::Create函数的第五个参数isLayeredWindow设置为false。demo中CefForm、CefNativeForm这两个窗体类分别用于演示离屏渲染模式(对应CefControl控件)和真窗口模式(对应CefNativeControl控件)的功能。这两个窗口的创建代码在MainForm::OnClicked中有演示代码

禁用Cef模块功能

cef_module项目中预处理宏中增加了两个控件Cef模块功能的宏SUPPORT_CEF、SUPPORT_CEF_FLASH。SUPPORT_CEF宏控制是否启用cef功能,

SUPPORT_CEF_FLASH控制cef是否支持flash播放功能(只有SUPPORT_CEF宏启用时这个宏才有效)。

如果不需要cef带来的浏览器功能,可以在cef_module项目中去掉SUPPORT_CEF宏,这样cef相关的功能就被禁用。同时*bin\\cef*目录就可以删除掉而不影响程序运行。

如果需要cef功能但是并不需要flash功能,可以在cef_module项目中去掉SUPPORT_CEF_FLASH宏。同时bin\\cef\\PepperFlash**目录可以删除掉、**libs目录的cef_sandbox.lib、cef_sandbox_d.lib文件也可以删掉。

在开启了Flash功能后,必须要在编译时加入

cef_sandbox.lib等静态库,否则在使用flash功能时会有一个黑框弹出(这输入cef的bug),同时程序将无法通过附加参数指定渲染子进程(此时必须用主进程exe来做渲染子进程),这时也就不需要cef_render项目编译的render.exe了。如果禁用Flash功能,则会让render.exe来作为渲染子进程

集成过程中遇到的其他坑

通过这些时间用Cef,发现坑其实不少,而且各个版本的坑

不一样。

multi_threaded_message_loop导致中断:在2623、2526版本,Debug模式中,如果开启了

multi_threaded_message_loop,当程序退出时,必定会触发中断。这个属于Cef的bug,在官方demo中也有这个问题,但是在Release模式中是没有问题的。2357版本在程序处理重定向信息后,会导致渲染进程崩溃,这个版本无法用于项目1916版本各个功能使用正常。但是在在Debug模式下某些网页打开时会出中断警告(但并不是错误),可能是因为对新html标准支持不够;Debug模式下单进程模式在退出时会触发中断。但是在Release模式下都正常使用设置CefSettings的cache_path字段(也就是LocalStorage),一定要注意不要在路径末尾添加”\\\\”,否则会触发中断在多进程模式下,必须设置子进程的程序名(不管是使用原程序作为子进程,还是单独一个程序作为子进程)。当Cef调用LoadUrl函数加载网页时,会查找子进程的绝对路径去启动渲染进程,如果不设置子进程名字,会导致查路径找发生错误,导致VS在Debug模式下卡死如果开发者不负责Cef相关功能的开发,可以修改CefManager::AddCefDllToPath函数的代码,让Cef不管在Debug模式还是Release模式下都使用Release版本的Cef Dll文件。这样做不会发生错误,而且上面提到的多数坑都不会被触发如果在使用Cef模块中遇到一


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

下一篇:甬教研2008110号

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

马上注册会员

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