关于CEF

近期由于工作需要开始研究了Google的Chromium Embedded Framework(CEF),这是一个基于Google Chromium开源代码的项目,使用CEF可以很方便的在你自己程序中显示Web。简单的调研后发现,现在很多主流的客户端都使用了CEF来显示Web页面:网易云音乐、QQ、豌豆荚等(安装目录下可以找到libcef.dll)。

下载CEF

我使用的是3.1650.1562版本,CEF的发布版本在这里下载http://www.magpcss.net/cef_downloads/,页面下方的Download List表格中列出的是最新的发布版本(包括Windows、Linux、MacOS平台的32、64位版本)。我下载的是cef_binary_3.1650.1562_windows32,如果表格中的版本不是3.1650.1562,可以点击 older (deprecated) versions去找到。下载到本地之后解压缩到本地文件夹(我解压到了D:\cef_binary_3.1650.1562_windows32),打开文件夹后使用VS2010开打cefclient2010.sln,可以看到两个项目:cefclient、libcef_dll_wrapper。编译Debug版本的cefclient项目,确保可以编译通过,此时会在out目录下(我的目录是D:\cef_binary_3.1650.1562_windows32\out\Debug)生成相应的文件,运行cefclient.exe会显示出Google的页面。cefclient是如何使用cef的一个例子,具体可以参考项目代码。

将CEF嵌入到单文档程序中

在VS2010中,点击菜单项文件-》新建-》项目,选择MFC应用程序,项目名称命名为:CEFBrowser,项目位置根据你上面的解压缩位置而定,我的是D:\cef_binary_3.1650.1562_windows32,解决方案选择“添加到解决方案”,点击“确定”。如下图所示:
 
 
在“应用程序类型”中选择“单个文档”,MFC的使用选择“在静态库中使用MFC”,其余的选项默认,点击“完成”。可以看到在解决方案中新添加了CEFBrowser项目。
 
 
 
 
首先,将CEFBrowser项目设置为启动项目。右键点击CEFBrowser打开项目的“属性页”,点击“通用属性”-》框架和引用-》添加新引用,在弹出的“添加引用”对话框中选择“libcef_dll_wrapper”项目,点击“确定”。如下图所示:
 

 
点击“确定”退出属性页。libcef_dll_wrapper生成静态库libcef_dll_wrapper.lib,输出到cef_binary_3.1650.1562_windows32\out\Debug\lib目
录下,我们的程序需要加载这个静态库,当然你也可以在设置中按照目录包含它,或者在程序中使用#pragma comment链接它。
 
然后,在“配置属性”-》C/C++-》常规-》附加包含目录,加入../,因为我们的程序需要inlclude文件夹下的头文件,include目录位于上一级目录。
 
 
其次,将cefclient项目属性页中的链接器-》常规-》附加库目录的内容全部拷贝到CEFBrowser项目的相应位置:
 
 
最后,将cefclient属性页的输入-》附加依赖项中的内容全部拷贝到CEFBrowser项目的相应位置,并且将最后的$(Configuration)\libcef.lib前面加上../改为../$(Configuration)\libcef.lib
 
 
以上工程的环境就配置好了,下面开始添加使用cef的代码:
 
  • 给CEFBrowser工程添加一个空白的头文件:ExampleCefApp.h,文件中加入如下代码:

    1. #pragma once
    2. #include "include/cef_app.h"
    3. class ExampleCefApp : public CefApp
    4. {
    5. public:
    6. ExampleCefApp ()
    7. {
    8. }
    9. virtual ~ExampleCefApp ()
    10. {
    11. }
    12. private:
    13. IMPLEMENT_REFCOUNTING (ExampleCefApp);
    14. };
  • 在给CEFBrowser工程添加一个空白的头文件:ExampleCefHandler.h,文件中加入如下代码:

    1. #pragma once
    2. #include "include/cef_client.h"
    3. class ExampleCefHandler : public CefClient,
    4. public CefContextMenuHandler,
    5. public CefDisplayHandler,
    6. public CefDownloadHandler,
    7. public CefDragHandler,
    8. public CefGeolocationHandler,
    9. public CefKeyboardHandler,
    10. public CefLifeSpanHandler,
    11. public CefLoadHandler,
    12. public CefRequestHandler
    13. {
    14. public:
    15. ExampleCefHandler();
    16. virtual ~ExampleCefHandler();
    17. CefRefPtr<CefBrowser> GetBrowser();
    18. #pragma region CefClient
    19. // since we are letting the base implementations handle all of the heavy lifting,
    20. // these functions just return the this pointer
    21. virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler () OVERRIDE;
    22. virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler () OVERRIDE;
    23. virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler () OVERRIDE;
    24. virtual CefRefPtr<CefDragHandler> GetDragHandler () OVERRIDE;
    25. virtual CefRefPtr<CefGeolocationHandler> GetGeolocationHandler () OVERRIDE;
    26. virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler () OVERRIDE;
    27. virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler () OVERRIDE;
    28. virtual CefRefPtr<CefLoadHandler> GetLoadHandler () OVERRIDE;
    29. virtual CefRefPtr<CefRequestHandler> GetRequestHandler () OVERRIDE;
    30. #pragma endregion // CefClient
    31. #pragma region CefDownloadHandler
    32. // this function is virtual and must be implemented; we do nothing in it, so downloading files won't work as the callback function isn't invoked
    33. virtual void OnBeforeDownload (CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item, const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback);
    34. #pragma endregion // CefDownloadHandler
    35. #pragma region CefLifeSpanHandler
    36. // cache a reference to the browser
    37. virtual void OnAfterCreated (CefRefPtr<CefBrowser> browser) OVERRIDE;
    38. // release the browser reference
    39. virtual void OnBeforeClose (CefRefPtr<CefBrowser> browser) OVERRIDE;
    40. #pragma endregion // CefLifeSpanHandler
    41. protected:
    42. // the browser reference
    43. CefRefPtr<CefBrowser> browser;
    44. // Include the default reference counting implementation.
    45. IMPLEMENT_REFCOUNTING (ExampleCefHandler);
    46. // Include the default locking implementation.
    47. IMPLEMENT_LOCKING (ExampleCefHandler);
    48. };
  • 然后给CEFBrowser工程添加一个空白的源文件:ExampleCefHandler.cpp,加入代码如下:
    1. #include "stdafx.h"
    2. #include "ExampleCefHandler.h"
    3. ExampleCefHandler::ExampleCefHandler ()
    4. {
    5. }
    6. ExampleCefHandler::~ExampleCefHandler ()
    7. {
    8. }
    9. CefRefPtr<CefBrowser> ExampleCefHandler::GetBrowser ()
    10. {
    11. return browser;
    12. }
    13. CefRefPtr<CefContextMenuHandler> ExampleCefHandler::GetContextMenuHandler ()
    14. {
    15. return this;
    16. }
    17. CefRefPtr<CefDisplayHandler> ExampleCefHandler::GetDisplayHandler ()
    18. {
    19. return this;
    20. }
    21. CefRefPtr<CefDownloadHandler> ExampleCefHandler::GetDownloadHandler ()
    22. {
    23. return this;
    24. }
    25. CefRefPtr<CefDragHandler> ExampleCefHandler::GetDragHandler ()
    26. {
    27. return this;
    28. }
    29. CefRefPtr<CefGeolocationHandler> ExampleCefHandler::GetGeolocationHandler ()
    30. {
    31. return this;
    32. }
    33. CefRefPtr<CefKeyboardHandler> ExampleCefHandler::GetKeyboardHandler ()
    34. {
    35. return this;
    36. }
    37. CefRefPtr<CefLifeSpanHandler> ExampleCefHandler::GetLifeSpanHandler ()
    38. {
    39. return this;
    40. }
    41. CefRefPtr<CefLoadHandler> ExampleCefHandler::GetLoadHandler ()
    42. {
    43. return this;
    44. }
    45. CefRefPtr<CefRequestHandler> ExampleCefHandler::GetRequestHandler ()
    46. {
    47. return this;
    48. }
    49. void ExampleCefHandler::OnBeforeDownload (CefRefPtr<CefBrowser> browser,
    50. CefRefPtr<CefDownloadItem> download_item,
    51. const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback)
    52. {
    53. UNREFERENCED_PARAMETER (browser);
    54. UNREFERENCED_PARAMETER (download_item);
    55. callback->Continue (suggested_name, true);
    56. }
    57. void ExampleCefHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser)
    58. {
    59. CefLifeSpanHandler::OnAfterCreated (browser);
    60. }
    61. void ExampleCefHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser)
    62. {
    63. CefLifeSpanHandler::OnBeforeClose (browser);
    64. }
  • 切换到“类视图”,右键点击CCEFBrowserView-》属性,在属性对话框中给类CCEFBrowserView添加WM_CREATE的响应函数OnCreate。在CEFBrowserView.cpp文件开头处加入如下代码:
    1. #include "ExampleCefApp.h"
    2. #include "ExampleCefHandler.h"
    3. #define INVALID_HWND (HWND)INVALID_HANDLE_VALUE
    4. namespace
    5. {
    6. CefRefPtr<ExampleCefHandler> example_cef_handler;
    7. HWND application_message_window_handle = INVALID_HWND;
    8. }

    OnCreate函数的代码如下:

    1. int CCEFBrowserView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    2. {
    3. if (CView::OnCreate(lpCreateStruct) == -1)
    4. return -1;
    5. // TODO:  在此添加您专用的创建代码
    6. CefMainArgs main_args ( AfxGetApp()->m_hInstance );
    7. CefRefPtr<ExampleCefApp> app (new ExampleCefApp);
    8. if (CefExecuteProcess(main_args, app.get()) == -1)
    9. {
    10. CefSettings settings;
    11. CefSettingsTraits::init( &settings);
    12. settings.multi_threaded_message_loop = true;
    13. CefInitialize (main_args, settings, app.get());
    14. example_cef_handler = new ExampleCefHandler();
    15. CefWindowInfo info;
    16. info.SetAsChild(m_hWnd, CRect(0, 0, 1200, 1200));
    17. CefBrowserSettings settings1;
    18. CefBrowserHost::CreateBrowser(info, example_cef_handler.get(), CefString ("http://www.sina.com"), setting1, NULL);
    19. }
    20. return 0;
    21. }

至此,所添加的代码完毕,好了现在编译工程CEFBrowser,在Debug目录

(我的路径是D:\cef_binary_3.1650.1562_windows32\Debug)中确认生成了CEFBrowser.exe,

同时编译器自动的将需要的一些CEF文件也拷贝到了此文件夹下。此时还不能成功运行CEFBrowser.exe

显示出页面,需要将上面我们编译cefclient项目产生的locales文件夹和cef.pak文件

(D:\cef_binary_3.1650.1562_windows32\out\Debug目录中)拷贝到Debug目录下

(提示是否替换,选择是),好了现在可以运行CEFBrowser.exe显示出新浪的页面了(结果如下图)。

Chromium Embedded Framework的更多相关文章

  1. Chromium Embedded Framework 中文文档(简介)

    转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...

  2. 利用 Chromium Embedded Framework (CEF) 定制提取 Flash 视频的浏览器

    功能介绍: 利用 CEF 分析网页源码, 提取 flash 视频的代码. 提取的视频代码 LoadString 和 JS 两种方式重新插入到浏览器. (CEF_3.2171.1979_win32 - ...

  3. Chromium Embedded Framework (CEF)_3.2171.2069_v20170606_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 [增加了960x90% 和 1280x90%] 这次修改是主要针对 YY web 直播平台 ...

  4. Chromium Embedded Framework (CEF)_3.2171.1979_v20170602_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 这次修改是主要针对 YY web 直播平台 对录屏的朋友有很大帮组 CEF_3.2171.1 ...

  5. Create an Embedded Framework in Xcode with Swift

    转自:http://zappdesigntemplates.com/create-an-embedded-framework-in-xcode-with-swift/ Post Series: Cre ...

  6. 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持

    一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...

  7. 构建基于Chromium的应用程序

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  8. 构建基于Chromium的应用程序(Winform程序加载Html页面)

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  9. Winform下CefSharp的引用、配置、实例与报错排除(源码)

    Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...

随机推荐

  1. 用TextWriterTraceListener实现建议log文件记录

    log4net之类3方组件确实很方便,但是想写个小小的demo之类的程序,有点用不起啊. 微软自带的TraceListener要实现一个简易的日志帮助类还是很简单的,直接上代码,自己备用,也希望对同样 ...

  2. github入门之更改提交操作--6

    1.回溯历史版本 1.1.回溯到创建feature-A分支前 1.1.1.要让仓库的HEAD.暂存区.当前工作树回溯到指定状态,需要用到提供目标时间点的哈希值 1.1.2.回溯至未创建feature- ...

  3. SharpSvn操作 -- 获取Commit节点列表

    /// <summary> /// 获取工作目录的所有节点,包括子目录 /// </summary> /// <param name="workingCopyD ...

  4. 什么是Office Online Server和SharePoint 2016

    Microsoft Office Online Server是Microsoft Office Web Apps(OWA)服务器的下一个版本,最初于2012年发布.,可以下载Office Online ...

  5. HDU 5500 Reorder the Books (水题)

    题意: 有n本书,编号为1~n,现在书的顺序乱了,要求恢复成有序的样子,每次只能抽出其中一本并插到最前面,问最少需要多少抽几次? 思路: 如果pos[i]放的不是书i的话,则书i的右边所有的书都必须抽 ...

  6. 【Python图像特征的音乐序列生成】解析ABC格式的文件(修改版)

    ABC格式,是一个音乐标准,ABC Plus Project最新的标准是2.x. ABC格式的音乐长成这样: X: T:Abacus % Nottingham Music Database S:By ...

  7. Android(java)学习笔记132:eclipse 导入项目是提示:某些项目因位于工作空间目录中而被隐藏。

    导致这个错误的原因是工程重名了: 并不是仅仅指文件夹重名,相信很多人也曾经修改过文件夹的名称,可惜没什么用处,关键是修改工程里面的一个文件! 也就是.project这个文件! 用记事本打开,修改一下& ...

  8. if...else...这段代码打印结果,并简述其理由

    var age = 20; if (age >= 6) { console.log('teenager'); } else if (age >= 18) { console.log('ad ...

  9. Mysql常用运算符与函数汇总

    Mysql常用运算符与函数汇总 本文给大家汇总介绍了mysql中的常用的运算符以及常用函数的用法及示例,非常的全面,有需要的小伙伴可以参考下 我们先把数据表建好 use test;create tab ...

  10. (2) html 语义化

    HTML语义化标签 1 什么是语义化标签? 通过标签判断内容语义,例如根据h1标签判断出内容是标题,根据 p 判断内容是段落.input 标签是输入框等. 2 为什么要标签语义化? 1.搜素引擎友好 ...