一、基本概览
  1. C++ Wrapper
    C++Wrapper(包装类)就是将C结构包装C++类。 这是C/C++API转换层通过translator tool自动产生的。
  2. 进程
    CEF3用多进程运行。     
  1. 主(浏览)进程 ——处理窗口创建,绘制和网络访问,会产生相同的进程作为主应用程序,及处理主应用程序的逻辑。
  2. 渲染进程——处理闪烁渲染和JavaScript的执行,也处理一些应用程序逻辑,如JavaScript绑定和DOM的访问。
  3. scheme + domain进程——默认的进程模型的渲染进程。每个进程有唯一的源
  4. 其他进程,如插件进程、gpu处理,是按需要产生的。
     默认的主应用程序可执行文件会分多次产生独立进程,这是通知command-line 标识传递给CefExecuteProcess函数。如果主应用程序执行大加载任务非常耗时,或是其他不适合在非浏览进程的任务可分多少可执行文件在其他程序中。这可通过 CefSettings.browser_subprocess_path 进行配置
     由CEF3产生的进程用IPC进行通信,浏览进程和渲染进程的应用逻辑通信是通过来回异步发送消息。而在渲染进程中JavaScript的通信是调用异步ap

3. 线程

     在CEF3中每个进程以多线程运行。 cef_thread_id_t枚举定义了所有线程列表。浏览进程包含4个线程:
  1. TID_UI 是浏览进程的主线程,如果主应用程序线程调用  CefInitialize()以CefSettings.multi_threaded_message_loop = false调用,那么主应用程序线程也是TID_UI.
  2. TID_IO 在浏览进程中用于处理进程IPC和网络消息。
  3. TID_FILE在浏览进程中用于与文件系统交互
  4. TID_RENDERER在渲染进程的主线程
     由于CEF本身是多线程,在线程中需要对访问的数据和传递的消息进行加锁。CEF3提供Lock和Unlock方法进行加锁,AutoLock块对象对代码进行同步访问。
     CefPostTask家族函数支持在两个线程之间进行消息传递。
      可以验证当前线程使用CefCurrentlyOn()函数,也可以使用以下宏,验证当前线程
     #define CEF_REQUIRE_UI_THREAD()       DCHECK(CefCurrentlyOn(TID_UI));
     #define CEF_REQUIRE_IO_THREAD()       DCHECK(CefCurrentlyOn(TID_IO));
     #define CEF_REQUIRE_FILE_THREAD()     DCHECK(CefCurrentlyOn(TID_FILE));
     #define CEF_REQUIRE_RENDERER_THREAD() DCHECK(CefCurrentlyOn(TID_RENDERER));
4. 引用计数
     CEF3的所有类及自己写的类都要实现CefBase接口,所有类的实例都通过CefRefPtr智能指针管理,CefRefPtr实现自动引用计数,AddRef和Release函数对引用计数进行加减。

IMPLEMENT_REFCOUNTING(MyClass);//让本类支持引用计数

5. 字符串

     CEF自定义字符串,有如下不同的原因:
  1. libcef库和主应用程序可以使用不同的运行时管理堆内存,所有的对象或字符串都需要在同一个运行时释放申请的空间
  2. libcef库可以支持不同形式的字符串类型(UTF8, UTF16和wide).默认使用UTF16,可修改cef_string.h的相关宏来改变。
     CEF3字符串的使用:
    • cef_string_set will assign a string value to the structure with or without copying the value.
    • cef_string_clear will clear the string value.
    • cef_string_cmp will compare two string values.
     在C++中使用CefString类表示字符串,CefString提供了从UFT8到std::wstring字符串的转换功能。
  1. std::string和CefString 相互转换
std::string str = “Some UTF8 string”;
// Equivalent ways of assigning |str| to |cef_str|. Conversion from UTF8 will occur if necessary.
CefString cef_str(str);
cef_str = str;
cef_str.FromString(str);
 // Equivalent ways of assigning |cef_str| to |str|. Conversion to UTF8 will occur if necessary.
 str = cef_str;
 str = cef_str.ToString();
     2. std::wstring和CefString 相互转换
 std::wstring str = “Some wide string”;
 // Equivalent ways of assigning |str| to |cef_str|. Conversion from wide will occur if necessary.
CefString cef_str(str);
cef_str = str;
cef_str.FromWString(str);
// Equivalent ways of assigning |cef_str| to |str|. Conversion to wide will occur if necessary.
str = cef_str;
 str = cef_str.ToWString();
     3. ASCII(char)和CefString之间转换
const char* cstr = “Some ASCII string”;
 CefString cef_str;
 cef_str.FromASCII(cstr);

4.cef_string_t 和CefString之间转换

CefSettings settings;
const char* path = “/path/to/log.txt”; // Equivalent assignments.
CefString(&settings.log_file).FromASCII(path);
cef_string_from_ascii(path, strlen(path), &settings.log_file);

CEF3研究(一)的更多相关文章

  1. CEF3研究(四)之javascript集成

    一.介绍 谷歌浏览器和CEF使用V8JavaScript Engine作为内容的JavaScript实现.在浏览器中的每个窗口都有它自己在的JS上下文提供作用域和在窗口中安全的执行JS代码.CEF暴露 ...

  2. CEF3研究(三)

    一.Off-Screen Rendering 脱屏绘制 CEF的脱屏渲染并不创建源生的浏览器窗口,而是CEF提供主应用程序在无效区域和像素buffer里渲染,然后主应用程序通过鼠标.键盘和焦点事件通知 ...

  3. CEF3研究(二)

    应用程序结构 每个CEF3应用程序都有一个相同的结构: 提供一个入口函数以初始化CEF和运行每个子进程逻辑和CEF消息处理 提供一个CefApp子类处理某个进程的回调 提供一个CefClinet子类处 ...

  4. 【转】MFC内嵌cef3浏览器内核

    一.cef3内核的下载 可以从http://opensource.spotify.com/cefbuilds/index.html下载,注意:很多版本编译都可以通过 但是运行的时候会崩溃,以cef_b ...

  5. [原创]Cef3 2623.1397 开启ppapi flash插件

    最近发现WKE播放Flash或者游戏时会有很多BUG,例如视频无法播放或者是Stage3D无法使用等问题. 经过研究应该是精简版本导致的,所以决定尝试使用CEF3移植入SOUI,但是DEMO中版本有点 ...

  6. CEF3中js调用delphi内部方法

    2015-01-20修改:以下方法不适合delphi7,在CEF3源码中限制了delphi_14 up,对于被我误导的朋友说声抱歉 在CEF1中JS调用delphi的方法已经贴过:http://www ...

  7. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  8. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  9. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

随机推荐

  1. DROP TYPE - 删除一个用户定义数据类型

    SYNOPSIS DROP TYPE name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP TYPE 将从系统表里删除用户定义的类型. 只有类 ...

  2. 一条update语句优化小记

    遇到性能问题的sql如下: sql1: UPDATE amlclientlevel a SET    a.client_value = (SELECT l.client_value           ...

  3. mysql在线开启或禁用GTID模式

    在线开启步骤: 1.要求: (1)必须是5.7.6版本以上的mysql (2)GTID状态为OFF 2.开启步骤: (1):SET GLOBAL ENFORCE_GTID_CONSISTENCY = ...

  4. Java Web中的编码解析

    在springmvc工程web.xml中配置中文编码 <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name&g ...

  5. ps---打开文件及图片保存格式

    1.打开图片,可以按Ctrl或者Shift来进行多张图片的选择或者用鼠标框选. 2.勾选图像序列,可以选择命名上有次序的多个图像. 3. PSD是ps里面的标准保存格式,包含颜色.图层.通道.路径.动 ...

  6. IDM下载器使用方法详解:百度网盘下载,视频会员一网打尽!

    一. IDM的设置 [01]IDM插件与各大浏览器的集成 默认情况下,在成功安装IDM后,直接点击这里的选项,会弹出[常规设置],一般情况下直接保持默认的配置即可,如果你使用的是比较小众的浏览器,你可 ...

  7. 剑指Offer(书):旋转数组的最小数字

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  8. jquery ajax示例

    $.ajax({ type: "POST",//方法类型 dataType: "json",//预期服务器返回的数据类型 url: "${ctx }/ ...

  9. CS academy Growing Trees【模板】DP求树的直径

    [题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少 ...

  10. 【HIHOCODER 1601】 最大得分(01背包)

    描述 小Hi和小Ho在玩一个游戏.给定一个数组A=[A1, A2, ... AN],小Hi可以指定M个不同的值S1,S2, S3 ... SM,这样他的总得分是 ΣSi × count(Si).(co ...