CEF3使用说明

所需积分/C币:32 2017-09-24 22:39:19 310KB PDF

Chromium Embedded Framework (CEF) 嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。 它的设计思想政治就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和Chromium&Webkit的操作细节
tools 每个二进制包包含一个 READMEtX文件和一个凵 CENSE, txt文件, README. tx用以描述平台 相关的细节,而 LICENSE txt包含CEF的BSD版权说明。如果你发布了基于CEF的应用,则应该 在应用程序的某个地方包含该版权声明。例如,你可以在"关于”和“授权”页面列出该版权声明, 或者单独一个文档包含该版权声明。“关于”和“授权”信息也可以分别在CEF浏览器 的" a bout: license"和" a bout: credits"页面查看。 基于CEF二进制包的应用程序可以使用每个平台上的经典编译工具。包括 Windows平台上的 isua| Studio, Mac osx平台上的 Xcode,以及 Linux平台上的gcc/make编译工具链。CEF 项目的下载页面包含了这些平台上编译特定版本CEF所需的编译工具的版本信息。在 Linux上编 译CEF时需要特别注意依赖工具链。 Tutoria wiki页面有更多关于如何使用CEF3二进制包创建简单应用程序的细节。 从源码编译( Building from Source Code) CEF可以从源码编译,用户可以使用本地编译系统或者像τε amCity这样的自动化编译系统编 译。首先你需要使用sⅦn或者gⅰt下载 Chromiun和CEF的源码。由于 Chromium源码很大,只 建议在内存大于4GB的现代机器上编译。编译 Chromium和CEF的细节请参 考 BranchesAnd Building页面。 示例应用程序( Sample application) cefclient是一个完整的CEF客户端应用程序示例,并且它的源码包含在CEF每个二进制发布包 中。使用CEF创建一个新的应用程序,最简单的方法是先从 cefclient应用程序开始,删除你不 需要的部分。本文档中许多示例都是来源于 cefclient应用程序。 重要概念( Important Concepts 在开发基于CEF3的应用程序前,有一些重要的基础概念应该被理解。 C++封装(C++ Wrapper) libcef动态链接库导出CAPl使得使用者不用关心CEF运行库和基础代码。 libcef dll wrapper工程把CAP封装成C++AP同时包含在客户端应用程序工程中,与 cefclient一样,源代码作为CEF二进制发布包的一部分共同发布。C/C++APl的转换层代码是 由转换工具自动生成。 Using TheCA页面描述了如何使用CAPl 进程( Processes) CEF3是多进程架构的。 Browser被定义为主进程,负责窗口管理,界面绘制和网络交互。 Blink的渲染和s的执行被放在一个独立的 Render 进程中;除此之外, Render进程还负责 Is Binding和对Dom节点的访问。 默认的进程模型中,会为每个标签页创建一个新的 Render进程。其他进程按需创建,例如管理 插件的进程以及处理合成加速的进程等都是按需创建。 默认情况下,主应用程序会被多次启动运行各自独立的进程。这是通过传递不同的命令行参数给 ceEⅹ ecute Process函数做到的。如果主应用程序很大,加载时间比较长,或者不能在非浏览 器进程里使用,则宿主程序可使用独立的可执行文件去运行这些进程。这可以通过配置 Cefsettings. browser subprocess path变量做到。更多细节请参考 Application Structure一节。 CEF3的进程之间可以通过PC进行通信。 Browse和 Render进程可以通过发送异步消息进行双 向通信。甚至在 Render进程可以注册在 Browse进程响应的异步 JavaScript APl 更多细节,请参考nter- Process communication一节。 通过设置命令行的- single- process,CEF3就可以支持用于调试目的的单进程运行模型。支持 的平台为: Windows, Mac os x和 Linux 线程( Threads) 在CEF3中,每个进程都会运行多个线程。完整的线程类型表请参照 cef thread id t。例如, 在 Browser进程中包含如下主要的线程 TID叩线程是浏览器的主线程。如果应用程序在调用调用 Ceflnitialize()时,传递 Cefsettings. multi threaded message|oop= false,这个线程也是应用程序的主线 程 TID O线程主要负责处理|PC消息以及网络通信 ● TID FILE线程负责与文件系统交互。 由于CEF采用多线程架构,有必要使用锁和闭包来保证数据的线程安全语义 IMPLEMENT LOCKING定义提供了Lock()和 Un lock()方法以及 Auto lock对象来保证不同代码 块同步访问数据。 CefpostTask函数组支持简易的线程间异步消息传递。更多信息,请参 考 Posting tasks章节。 可以通过 Cefcurrentlyon(方法判断当前所在的线程环境, cefclient工程使用下面的定义来确 保方法在期望的线程中被执行 #define REQUiRe UI THREAd() assert Cef lyOn (TID Uf)) *define REQUIRE IO THREAD() asseRT( CefCurrentlyOn(TID IO)) #define REQUIRE FILE THREAD() ASSERT CefCurrentlyOn (TID FILE)); 引用计数( Reference Counting) 所有的框架类从 Cefbase继承,实例指针由 Cefrefptr管理, Cefrefptn通过调用 AddRef()和 Release()方法自动管理引用计数。框架类的实现方式如下: class MyClass public CefBase t public // Various class methods here private: / Various class members here IMPLEMENT REFCOUNTING(MyCLass); / Provides atomic refcounting implementati // References a MyClass instance CefRefPtr<MyCLass> my class new MyClass(); 字符串( Strings) CEF为字符串定义了自己的数据结构。主要是出于以下原因 libcef包和宿主程序可能使用不同的运行时,对堆管理的方式也不同。所有的对象,包括字符 串,需要确保和申请堆内存使用相同的运行时环境。 - libcef包可以编译为支持不同的字符串类型(UTF8,UTF16以及WDE)。默认采用的是 UTF16,默认字符集可以通过更改 cef string . h文件中的定义,然后重新编译来修改。当使用宽 字节集的时候,切记字符的长度由当前使用的平台决定。 UTF16字符串结构体示例如下 typedef struct cef string utf16 t i charl str: // Pointer to the string size t length; / String length void dtor)( char16* str); / Destructor for freeing the string on the corr ect heap f cef string utf16 t 通过 typedef来设置常用的字符编码。 typedef char l6 cef char t typedef cef string utf16 t cef string t: CEF提供了一批C语言的方法来操作字符串(通过# define的方式来适应不同的字符编码) · cef string_set对制定的字符串变量赋值(支持深拷贝或浅拷贝)。 · cef string clear清空字符串。 · cef string cmp比较两个字符串。 CEF也提供了字符串不同编码之间相互转换的方法。具体函数列表请查阅 cef string. h和 cef string types. h文件。 在C++中,通常使用 Cefstring类来管理CEF的字符串。 Cefstring支持与std: string(UTF8)、 std: wstring(wide)类型的相互转换。也可以用来包裹一个 cef string t结构来对其进行赋值 和std: string的相互转换 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 cef str. FromString (str) / Equivalent ways of assigning cef str to str. Conversion to UTF8 will oc cur if necessary. str= cef str. str cef str Tostring() 和std: wstring的相互转换 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)i / Equivalent ways of assigning cef strI to str. Conversion to wide will oc cur if necessary tr= cef st str= cef str Tostring() 如果是ASC编码,使用 FromAsc进行赋值 const charx cstr =Some AscIi string Cefstring cef str cef str. FromASCII(cstr) 一些结构体(比如 Cefsettings)含有 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) 命令行参数( Command Line arguments) 在CEF3和 Chromium中许多特性可以使用命令行参数进行配置。这些参数采 用--some- argument[= optional- param]形式,并通过 CefExecute Process(和 CefMainArgs 结构(参考下面的应用资源布局章节)传递给CEF。在传递Cef5 settings结构给 Cefinitja|ize( 之前,我们可以设置 Cefsettings. command line_ args disabled为true来禁用对命令行参数 的处理。如果想指定命令行参数传入主应用程序,实现 Netapp:Oη Before CommandLine processing()方法。更多关于如何查找已支持的命令行选 项的信息,请查看 client switches.cpp文件的注释。 应用程序布局( Application Layout) 应用资源布局依赖于平台,有很大的不同。比如,在 Mac osⅩ上,你的资源布局必须遵循特定 的 app bundles结构; Window与 Linux则更灵活,允许你定制CEF库文件与资源文件所在的位 置。为了获取到特定可以正常工作的示例,你可以从工程的下载页面下载到一个 client压缩包。 每个平台对应的 README txt文件详细说明了哪些文件是可选的,哪些文件是必须的 Windows操作系统( Windows) 在 Windows平台上,默认的资源布局将 libcef库文件、相关资源与可执行文件放置在同级目 录,文件夹结构大致如下: Application/ cefclient exe < cefclient application executable libcef dll < main CeF library icudt dll < ICu unicode support library f fmpegsumo dll < HTML5 audio/video support library libEGL dll libgleSv2 d < accelerated compositing support libraries cef. pak, devtools resources. pak < non-localized resources and strings locales/ en-US.pak, m < locale-specific resources and strings 使用结构体 Cefsettings可以定制CEF库文件、资源文件的位置(查看 README.txt文件或者本 文中 Cefsettings部分获取更详细的信息)。虽然在 Windows平台上, cefclient项目将资源文 件以二进制形式编译进 cefclientro文件,但是改为从文件系统加载资源也很容易。 Linux操作系统( Linux) 在 Linux平台上,默认的资源布局将 rlibcef库文件、相关资源与可执行文件放置在同级目录。注 意:在你编译的版本与发行版本应用程序中, libcef. so的位置是有差异的,此文件的位置取决 于编译可执行程序时,编译器 rpath的值。比如,编译选项为“wWl,『path,"(“"意思是当前文 件夹),这样 libcef. s0与可执行文件处于同级目录。 libcef. so文件的路径可以通过环境变量中 的“ LD LIBRARY PATH"指定 Application/ cefclient cefclient application executable libcef 50 <= main CEF library ffmpegsumo So <- HTML5 audio/video support library cef. pak, devtools resources. pak < non-Localized resources and strings locales/ en-US. pak, n < locale-specific resources and strings files/ binding. html, m<- cefclient application resources 使用结构体 Cefsettings可以定制CEF库文件、资源文件〔查看 README. txt文件或者本文中 Cefsettings部分获取更详细的信息)。 MaCX平台( Mac osx) 在MaCⅩ平台上, app bundles委托给了 Chromiun实现,因此不是很灵活。文件夹结构大致 如下 cetclient. app/ Contents/ Frameworks/ Chromium Embedded framework framework/ Libraries/ ffmpeg umo. So <= HTML5 audio/video support library Libcef dylib < main CEF library Resources/ cef. pak, devtools resources. pak < non-localized resources and strings png, * tiff < Blink image and cursor resources en, proj/, m < locale-specific resources and strings libplugin carbon interpose, dylib<= plugin support library cefclient Helper, app/ Contents Info. plist Macos cefclient Helper < helper executable Pkginf cefclient Helper EH. app Contents/ In千 o, plist p MacoS/ cefclient Helper eh < helper executable Pkginfo fclient Helper NP. app/ Contents/ Info. plist Macos efclient Helper np<= helper executable Pkginfo Info. plist MacOS/ cefclient < cefclient application executable Pkginfo Resources/ binding. html, m < cefclient application resources 列表中的“ Chromium embedded framework framework”,这个未受版本管控的框架包含 了所有的CEF库文件、资源文件。使用 instal name too l与@ executable_path,将 cefclient, cefclient helper等可执行文件,连接到了 libcef dylib上。 应用程序 cefclient helper用来执行不同特点、独立的进程( Renderer, plugin等),这些进 程需要独立的资源布局与lnfo. plist等文件,它们没有显示停靠图标。用来启动插件进程的EH Helper清除了 MH NO HEAP EXECUTION标志位,这样就允许一个可执行堆。只能用来启动 NaCL插件进程的 NP Helper,清除了 MH PIE标志位,这样就禁用了ASLR。这些都是 tools文 件夹下面,用来构建进程脚本的一部分。为了理清脚本的依赖关系,更好的做法是检査发行版本 中的 Xcode工程或者原始文件 cefclient gyp 应用程序结构( Application Structure) 每个CEF3应用程序都是相同的结构 提供入口函数,用于初始化CEF、运行子进程执行逻辑或者CEF消息循环。 提供 NetApp实现,用于处理进程相关的回调。 ·提供 Cefclient实现,用于处理Br。wser实例相关的回调。 ·执行 CefBrowserHost: Create browser(创建一个 Browser实例,使用 CetLifespanHandler管理 Browser对象生命周期 入口函数 Entry- Point function) 像本文中进程章节描述的那样,一个CEF3应用程序会运行多个进程,这些进程能够使用同一个 执行器或者为子进程定制的、单独的执行器。进程的执行从入口函数开始,示例 cefclient win.cc、 cefclient gtkcc、 cefclient mac mm分别对应 Windows、 Linux和 Mac os-X平台下的实现。 当执行子进程时,CEF将使用命令行参数指定配置信息,这些命令行参数必须通过 CefMainArgs结构体传入到 CefExecute Process函数。 CefMainArgs的定义与平台相关,在 Linux、 Mac os x平台下,它接收main函数传入的argc和argV参数值。 CefMainArgs main args(argc, argv); 在 Windows平台下,它接收 WWinmain函数传入的参数:实例句柄( HINSTANCE),这个实 例能够通过函数 GetModulehand|e(NULL)获取 CefMainArgs main args(hInstance 单一执行体( Single Executable) 当以单一执行体运行时,根据不同的进程类型,入口函数有差异。 Windows、 Linux平台支持 单一执行体架构, Mac osⅩ平台则不行。 int main(int argc, chark argv[])t / Structure for passing command-Line arguments // The definition of this structure is platform-specific CefMainArgs main args(argc, argv): // Optional implementation of the CefApp interface CefRefPtr<MyApp> app new MyApp) / Execute the sub-process logic, if any. This will either return immediatel y for the browser // process or block until the sub-process should exit int exit code CefExecuteProcess( main args, app. get()); if (exit code >=0)t / The sub-process terminated, exit now return exit code // Populate this structure to customize cef behavior Cefsettings settings // Initialize CEF in the main process CefInitialize(main args, settings, app. get() // Run the CEF message loop. This wilt block until CefQuitMessageLoop() is c alled CefRunMessageLoop() / Shut down CEF Cefshutdown() return 0 分离子进程执行体( Separate Sub-Process Executable) 当使用独立的子进程执行体时,你需要2个分开的可执行工程和2个分开的入口函数。 主程序的入口函数 / Program entry- point function //程序入口函数 int main(int argc, char* argv[])i // Structure for passing command-Line arguments //The definition of this structure is platform-specific /传递命令行参数的结构体。 //这个结构体的定义与平台相关 CefMainArgs main args (argc, argv); // Optional implementation of the CefApp interface /可选择性地实现 CefApp接口 CefRefptr<MyApp> app( new MyApp); / Populate this structure to customize Cef behavior /填充这个结构体,用于定制CEF的行为。 Cefsettings settings // Specify the path for the sub-process executable /指定子进程的执行路径 Cefstring(&settings. browser subprocess path). FromASCII("/path/to/subprocess / Initialize cef in the main process /在主进程中初始化CEF CefInitialize(main args, settings, app. get() // Run the CEF message loop. This will block until CefQuitMessageloop() is c alled

...展开详情

评论 下载该资源后可以进行评论 1

JerryLoveverKathy 相当不错的资源,可以下载
2017-12-14
回复
img
bingo88

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐