CEF3研究(一)

CEF3研究(一)

2015年10月14日 09:51:03 cqclark 阅读数 5859

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/cqclark/article/details/49121013

一、基本概览

  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);
### 回答1: CEF(Chromium Embedded Framework)是一个用于开发嵌入式浏览器的开源框架。CEF 可以在 C++、C#、JavaScript 和 Delphi 等语言中使用,但这里以 C 语言为例。 首先,你需要安装 CEF 的开发包,然后在 C 程序中包含 cef.h 头文件: ```c #include "cef.h" ``` 接下来,需要定义一个 CefApp 类的子类,并实现其中的一些回调函数。这些回调函数可以被 CEF 调用,以响应特定事件,如浏览器初始化、加载页面、接收到 JavaScript 请求等。 ```c class MyCefApp : public CefApp { public: virtual void OnBeforeCommandLineProcessing( const CefString& process_type, CefRefPtr<CefCommandLine> command_line) OVERRIDE { // 在这里可以修改 CEF 的命令行参数 } virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() OVERRIDE { return this; } virtual void OnContextInitialized() OVERRIDE { // 在这里可以创建浏览器窗口 } }; ``` 最后,需要调用 CefExecuteProcess() 和 CefInitialize() 函数来初始化 CEF。 ```c int main(int argc, char* argv[]) { CefMainArgs main_args(argc, argv); // 处理 CEF 的命令行参数 CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine(); command_line->InitFromString(::GetCommandLineW()); // 创建 MyCefApp 实例 CefRefPtr<MyCefApp> app(new MyCefApp()); // 初始化 CEF CefInitialize(main_args, *command_line, app.get(), NULL); // 运行 CEF ### 回答2: CEF(Chromium Embedded Framework)是一款基于谷歌开源的Chromium项目的嵌入式浏览器框架。用C语言编写CEF的样例可以按照以下步骤进行: 1. 下载和配置CEF:首先从CEF官方网站(https://cefproject.github.io/)下载适合你的操作系统和编译器的CEF版本,并将其解压到你的项目文件夹中。 2. 创建C文件:在项目文件夹中创建一个新的C文件,例如main.c。 3. 引入CEF库和头文件:在main.c文件中使用#include指令引入CEF库和头文件,以便能够调用CEF的功能和API。 4. 编写CEF初始化代码:在main函数中编写CEF初始化的代码,包括设置CEF的启动参数、初始化CEF框架、创建CEF进程等。 5. 创建CEF窗口:使用CEF的API创建一个新的窗口,并加载指定的URL或本地文件。 6. 处理CEF事件循环:使用CEF的API监听和处理CEF的事件循环,如鼠标点击、键盘输入等。可以编写自定义函数来处理不同的事件。 7. 释放CEF资源:在程序退出前,记得释放CEF的资源,包括关闭CEF窗口、关闭CEF进程等。 以下是一个简单的CEF使用样例: ```c #include <stdio.h> #include <stdlib.h> #include <cef_app.h> #include <cef_browser.h> #include <cef_client.h> int main(int argc, char* argv[]) { CefMainArgs args(argc, argv); CefRefPtr<CefApp> app(new CefAppImpl()); // 初始化CEF框架 int code = CefExecuteProcess(args, app, NULL); if (code >= 0) { return code; } CefSettings settings; // 设置CEF启动参数 CefInitialize(args, settings, app, NULL); // 创建CEF窗口 CefWindowInfo windowInfo; // 设置窗口参数,例如窗口位置、大小等 CefBrowserSettings browserSettings; // 设置浏览器参数,例如是否启用JavaScript、Flash等 CefRefPtr<CefBrowser> browser = CefBrowserHost::CreateBrowserSync(windowInfo, new CefClientImpl(), "https://www.baidu.com", browserSettings, NULL); // 处理CEF事件循环 CefRunMessageLoop(); // 释放CEF资源 browser->GetHost()->CloseBrowser(true); CefShutdown(); return 0; } ``` 上述样例是一个基本的CEF应用程序,它创建一个CEF窗口并加载百度的首页,然后监听和处理CEF的事件循环,最后退出程序时释放CEF的资源。当然,为了更好地理解CEF的使用和功能,你需要深入研究CEF的API文档和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值