Windows下cef开发和封装

  • 一,封装包组成说明
  • 二,浏览器工程集成步骤
    • 1,创建一个合适的vc工程。
    • 2,将工程设置成unicode,静态库使用mfc。
    • 3,将SDK目录拷贝到合适的路径下(例如解决方案目录),在vc工程中添加SDK路径。
    • 4,在生成事件中添加对清单文件的添加。
    • 5,至此,vs工程的cef开发环境准备好了。
    • 6,将SDK中browser子目录中所有文件都添加到vc工程中。
    • 7,将引入工程的文件中(即browser子目录中的所有文件)所有.cc和.cpp文件修改“预编译头”为“不使用预编译头”。
    • 8,浏览器工程中主要用到的类,接口和引用的文件。
    • 9,需要说明的事情。
    • 10,至此,可以完整进行编译了。
    • 11,最终效果
  • 附录:
    • 1,关于Debug模式下_HAS_ITERATOR_DEBUGGING

本工程的cef内核基于中95版本(95.7.18+g0d6005e+chromium-95.0.4638.69)的官方32位release版本来作为范例的。封装包是基于官方demo进行增删封装,链接如下:
封装包

一,封装包组成说明


Cef Resources,Cef的内核库和必须的资源文件,包含Debug版本和Release版本,分别在Debug和Release子目录中。在调试和最后发行的时候,需要将对应的子目录中的所有文件拷贝到开发的Cef工程目录中。

SDK,包括浏览器内核的封装代码和两个清单文件,浏览器内核的库,另附加一个日志库。

browser,这个是对IE和Cef内核调用的一个封装,方便浏览器工程能尽量简单的使用。两种内核,统一接口,并行存在。

third_party,包含cef的库以及log4cplus日志库。库分Debug和Release版本。

二,浏览器工程集成步骤

1,创建一个合适的vc工程。

2,将工程设置成unicode,静态库使用mfc。

使用静态编译,是因为官方提供的发行版libcef.dll就是静态编译的。

然后确认工程的运行库是MTd(Debug编译)和MT(Release编译)。

3,将SDK目录拷贝到合适的路径下(例如解决方案目录),在vc工程中添加SDK路径。

头文件路径:

依赖库路径:

附加依赖项:

libcef.lib;libcef_dll_wrapper.lib;log4cplusUD.lib;comctl32.lib;rpcrt4.lib;shlwapi.lib;ws2_32.lib;cef_sandbox.lib;Advapi32.lib;dbghelp.lib;Delayimp.lib;OleAut32.lib;PowrProf.lib;Propsys.lib;psapi.lib;SetupAPI.lib;Shell32.lib;version.lib;wbemuuid.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib

其中log4cplusUD.lib是debug版,log4cplusU.lib是release版本。

对于uafxscwd.lib,libcmtd.lib,uafxcw.lib,libcmt.lib这四个文件的添加或者忽略与否,跟实际编译相关。这几个文件是因为工程选择静态编译而可能需要采用下图中的方式进行配置的。



注意这四个运行时库文件的顺序。

4,在生成事件中添加对清单文件的添加。


命令行范例:

setlocal
mt.exe -nologo -manifest "$(SolutionDir)SDK/project.manifest" "$(SolutionDir)SDK/compatibility.manifest" -outputresource:"$(SolutionDir)bin/$(Configuration)/$(ProjectName).exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone

5,至此,vs工程的cef开发环境准备好了。

另外,要将Cef Resources中的文件拷贝到vs工程对应的输出目录(exe输出目录)中,日志库的dll(SDK/third_party/log/log4cplus/lib)和配置文件(SDK/third_party/log/log4cplus/log.properties),也需要放在vs工程的输出目录中。

6,将SDK中browser子目录中所有文件都添加到vc工程中。

7,将引入工程的文件中(即browser子目录中的所有文件)所有.cc和.cpp文件修改“预编译头”为“不使用预编译头”。


选中引入文件中的所有.cc和.cpp,然后右键它们,选择“属性”-》“C/C++”-》“预编译头”-》“不使用预编译头”。

8,浏览器工程中主要用到的类,接口和引用的文件。

对于SDK中browser中的框架,简单描述下就是:
BaseBrowserLogger.h/.cpp,日志类BaseBrowserLogger。它的接口全是静态函数,方便使用。需要在vc工程代码的开始和结束之处分别调用BaseBrowserLogger::LogInit()和BaseBrowserLogger::LogRelease()。
BaseBrowserHelper.h/.cpp,掌控浏览器内核接口对象的工厂类BaseBrowserHelper.。它包含一个自身的静态对象,方便在浏览器工程的不同窗口中直接调用其接口。
BaseBrowserLoader.h/.cpp,接口类BaseBrowserLoader,定义浏览器内核加载/释放接口。
BaseBrowserManager.h/.cpp,接口类BaseBrowserManager,定义浏览器窗口创建/关闭的接口,获取所有浏览器窗口列表的接口等,同时包含回调函数接口。
BaseBrowserWindow.h/.cpp,接口类BaseBrowserWindow,定义浏览器窗口常用功能的接口,如打开url,改变大小,设置窗口标题,跟页面执行js交互等,同时包含回调函数接口。
简单的说就是BaseBrowserHelper创建BaseBrowserLoader对象,而BaseBrowserLoader创建BaseBrowserManager对象,BaseBrowserManager创建BaseBrowserWindow对象。

9,需要说明的事情。

(1),cef
cef是一个多进程的库,通常包含一个browser进程和若干renderer进程,还有gpu进程和其他进程等等。

SDK并没有为cef库专门开发renderer等子进程,cef库就会默认直接将browser进程以传入命令行参数运行方式运行起来,作为各子进程。任务管理器中,没有任何命令行参数的进程,就是browser进程,也就是主进程,关闭主进程,其他子进程也会一并自动关闭。
我们创建的vc工程,有自己的UI和代码逻辑,同时我们集成cef进来,创建浏览器窗口,对浏览器窗口进行操作,这些都是应该在browser进程中执行的,也就是说,vc工程进程和cef的browser进程是同一个。我们应当避免vc工程自己的UI和代码逻辑,在非browser进程中被执行,否则,就会出现同时开若干个vc工程的怪异情况。简单的说就是,我们应当在vc工程代码的入口(例如main函数)判断当前进程是否browser进程(使用CefExecuteProcess函数的返回值来判断),如果不是,则直接退出,否则就正常进入vc工程代码循环以及cef代码循环。


SDK中将cef代码循环单独用一个工作线程来启动,避免跟vc工程代码循环相互影响,导致性能低下耦合度过高容易崩溃。同时指定cef以单线程消息循环方式运行(multi_threaded_message_loop=0),也就是cef自己的UI线程(ClientHandler所在的线程,也即各种回调的线程)和其主线程(也即调用CefInitialize函数的线程)是同一线程,窗口的创建和各种回调都在同一个线程中处理。虽然也可以设置cef以多线程消息循环方式(multi_threaded_message_loop=1),也就是UI线程和主线程不是同一个线程,使代码耦合度更低,只是这样,处理起来也越复杂,会出现大量跨线程函数调用和数据传递,目前可以暂不考虑。
另外,注意,SDK中的回调接口,是在cef的线程中被调用的,想要跟vc工程代码交互,就是一个跨线程的事情了。
最后,关于浏览器窗口的创建的一点说明。SDK创建浏览器窗口时,会动态创建一个window(使用win32 api CreateWindowEx),然后将CefBrowserHost绑定到这个window上。这个window的部分属性,通过BrowserWindowConfig 来设置。这个window可以是一个独立的弹出窗口,也可以作为子窗口依附在vc工程中创建的任何窗口中(dialog,view等)。作为子窗口时,父窗口关闭的时候,注意要调用浏览器窗口的关闭,同理,父窗口改变大小的时候,也要调用浏览器窗口的改变窗口大小。

在所有cef浏览器窗口关闭之前,强行退出vs工程会导致cef报错,因此窗口退出前需要先close窗口。

(2),ie
略过。尽管主体功能有了,并且能跟cef窗口同时存在,但是ie内核窗口不如cef窗口效率高,这里就不细说了。各接口使用规则同上面cef的,毕竟封装包中已经简单封装了。

10,至此,可以完整进行编译了。


还有一个地方需要注意,在高版本(例如95版本)的cef工程中,Debug编译中添加了一个特别参数_HAS_ITERATOR_DEBUGGING,而92版本则没有这种问题。不过,Release版本则没有这一问题。关于这个地方,详见附录。

11,最终效果


附录:

1,关于Debug模式下_HAS_ITERATOR_DEBUGGING

定义迭代器在调试功能是否启用调试版本。默认情况下,调试启用迭代器。有关详细信息,请参阅调试迭代器支持。
若要启用迭代器调试调试版本中,将 _HAS_ITERATOR_DEBUGGING 设置为 1:
#define _HAS_ITERATOR_DEBUGGING 1
_HAS_ITERATOR_DEBUGGING 不能设置为 1。零售版本。
若要禁用迭代器调试调试版本中,将 _HAS_ITERATOR_DEBUGGING 设置为 0:
#define _HAS_ITERATOR_DEBUGGING 0

95版本的cef和chromium的代码中,都在Debug编译的时候添加_HAS_ITERATOR_DEBUGGING编译参量,虽然可以把集成cef的工程中Debug编译时也添加这个参量以便顺利通过编译,但是,如果还引用其他第三方库,可能会出莫名其妙的问题。

上图是cef官方代码生成的工程里面的预处理器参数,可以看见Debug编译下包含了_HAS_ITERATOR_DEBUGGING,其实,官方下载的chromium文件中sandbox.lib的Debug版本都是用带有_HAS_ITERATOR_DEBUGGING进行编译的。
小结下就是这样的:
我们自己开发的整合cef的工程,Debug编译中,如果不指定_HAS_ITERATOR_DEBUGGING =0,就会报下面的错误。

如果指定了,也可能导致其他第三方库使用出现问题。
但是,如果我们将libcef_dll_wrapper工程的Debug编译参数中清除掉_HAS_ITERATOR_DEBUGGING =0,然后编译出新版,然后我们自己的工程,就不需要指定_HAS_ITERATOR_DEBUGGING了,如此就不影响其他第三方库的使用。不过,如果我们的工程需要用到sandbox.lib,那就没法了。
当然了,这个_HAS_ITERATOR_DEBUGGING说了这么多,它只出现在Debug编译中。

Windows下vc开发chrome浏览器工程的一点粗浅理解和封装相关推荐

  1. linux 关闭浏览器,在Linux和Windows下关闭谷歌Chrome浏览器中的通知提醒的方法

    本文教你使用浏览器内置的设置来关闭谷歌Chrome浏览器中的通知提醒,支持Linux和Windows等跨平台. 前言 谷歌的Chrome浏览器允许网站向用户推送通知/提醒,自然用户也可以阻止这些通知. ...

  2. 乐视三合一体感摄像头--windows下的开发2

    乐视三合一体感摄像头--windows下的开发 Introduction 环境配置过程 参考资料 后言 Introduction 解决上篇教程乐视三合一体感摄像头–基本信息及windows下部分开发: ...

  3. Python+Django+Eclipse 在Windows下快速开发自己的网站

    Python+Django+Eclipse 在Windows下快速开发自己的网站 一.配置开发环境 我的开发环境是:Python3.3.2 + Django1.5.2 + Eclipse 1.安装Py ...

  4. QT + OpenCV + MinGW 在windows下配置开发环境

           由于研究项目需要,最近开始接触C++界面设计,关于"QT + OpenCV + MinGW在windows下配置开发环境"着实让人头疼,单次配置时间相当长,也十分不容 ...

  5. Windows下Android开发环境搭建和配置

    关于Windows下Android开发环境搭建.配置方面文章,网上一搜一堆,为方便以后参考,权且做个记录,主要关注安装过程中的注意事项.对新手提醒的是,本文介绍SDK开发Android APK环境搭建 ...

  6. Windows 下 PHP 开发环境配置系列二(使用 MODx CMS)

    Windows 下 PHP 开发环境配置系列一(PHP+Apache+MySql; Zend Debugger+PDT) 软件的下载地址在系列一中有列出 1. 需安装软件 PHP:   php-5.2 ...

  7. linux chrome 网页字体,Linux 环境下怎么使 Chrome 浏览器字体更漂亮

    Linux 环境下如何使 Chrome 浏览器字体更漂亮 Windows 就免谈了,本身字体渲染技术 Cleartype 以及 DirectWrite 就稀烂得一塌糊涂.Mac 下面本来字体渲染就很好 ...

  8. windows下spark开发环境配置

    --本篇随笔由同事葛同学提供. windows下spark开发环境配置 特注:windows下开发spark不需要在本地安装hadoop,但是需要winutils.exe.hadoop.dll等文件, ...

  9. 【1】windows下IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

最新文章

  1. Run Android on Your Netbook or Desktop
  2. 如何更准确的理解面向对象编程中的对象
  3. luogu P4183 Cow at Large P (暴力吊打点分治)(内有时间复杂度证明)
  4. 常用Git指令常用git命令清单
  5. OCA第5部分中的Java难题
  6. 去除EditPlus自动备份功能. bak
  7. 小哥哥你有98K吗?利用Python制作一款多功能变声器!
  8. 蚂蚁金服“定损宝”现身AI顶级会议NeurIPS
  9. WPF 加载GIF图片
  10. ace unlck工具下载_iPhoneX如何解锁ID激活锁
  11. 华东师范 2018年 研究生复试上机题解合集
  12. 项目设计:基于STM32的指纹/刷卡的门禁/考勤/智能小区管理系统
  13. 乔治城大学计算机专业,Georgetown的Computer Science「乔治城大学计算机科学系」
  14. python3 + scrapy爬取妹子图(meizitu.com)
  15. 三国皇帝的寡妇秘史(1)
  16. realsense D435获取RGB-D数据集-制作.klg文件
  17. B站左程云算法视频笔记(01
  18. #榜样的力量#思必驰疫情防控机器人丨数据猿新冠战“疫”公益策划
  19. 互联网广告的发展现状与趋势分析
  20. Unity小优化之美术字贴图合并以合批

热门文章

  1. vue 仿外卖app-数据mock部分
  2. jpg怎么转换成pdf文档
  3. 以index.wxml为例解析WXML
  4. Python爬虫之xlml解析库
  5. 数学一年级应用题_一年级数学下册应用题大全(附带答案)
  6. 【Linux服务器】登录Linux服务器后,登陆信息显示佛祖保佑、永不死机,小猪佩奇等图案
  7. 在unity中创建python机器学习环境
  8. LightOJ 1197 Help Hanzo
  9. 解救小哈(深度优先,广度优先)
  10. 计算机图形学-油画家算法