当前位置 博文首页 > replayb的博客:VS2019 MFC中使用CEF

    replayb的博客:VS2019 MFC中使用CEF

    作者:[db:作者] 时间:2021-07-26 17:50

    VS2019 MFC中使用CEF

    Chromium Embedded Framework (CEF)是基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。
    软件环境:
    Windows 10家庭版
    Visual Studio 2019
    CEF 83.3.11+g1fac1e5+chromium-83.0.4103.61 / Chromium 83.0.4103.61,这个版本的Debug与VS2017有些不兼容,只能使用Release方式编译。但在VS2019中均可编译通过。
    “D:\MyProjectsVS.1\cef_binary_83.3.11\”为CEF工程目录

    下载(http://opensource.spotify.com/cefbuilds/index.html#windows32_builds)
    cef_binary_83.3.11+g1fac1e5+chromium-83.0.4103.61_windows32.tar.bz2
    如果需要调试信息,则还需要下载:(具体用法自行查找)
    cef_binary_83.3.11+g1fac1e5+chromium-83.0.4103.61_windows32_debug_symbols.tar.bz2
    我使用的是32位版的

    解压后使用CMake工具生成VS2019的工程,步骤如下:

    1. 选择好源和目的文件夹
    2. 配置生成器为Visual Studio 16 2019
    3. 生成目标环境
    4. 使用VS2019打开工程

    在这里插入图片描述
    在这里插入图片描述
    编译工程,注意选择Win32平台Debug方式,完成后获得以下三个文件:
    D:\MyProjectsVS.1\cef_binary_83.3.11\Debug\ libcef.lib
    D:\MyProjectsVS.1\cef_binary_83.3.11\Debug\ libcef.dll
    D:\MyProjectsVS.1\cef_binary_83.3.11\libcef_dll_wrapper\Debug\libcef_dll_wrapper.lib

    由于CEF是多进程内嵌,所以需要两个类class SimpleApp和class SimpleHandler,其中SimpleApp是用于在用户程序中创建内嵌CEF应用,而SimpleHandler是负责传递各种消息,这些消息是以虚函数的形式显现出来。SimpleHandler是继承于多个处理类,每增加一个处理类需要调用该类的GetDisplayHandler函数取得句柄,然后调用各种消息处理函数。

    导入自己的工程需要四个文件(可改名),其中的产生的CefBrowser指针需由自己管理,官方例子中使用了std::list类型保存多个实例。
    simple_app.cc
    simple_app.h
    simple_handler.cc
    simple_handler.h
    另外还要将D:\MyProjectsVS.1\cef_binary_83.3.11\include目录复制到自己的工程。

    在应用程序的CMyApp::InitInstance()中添加初始化代码:

    CefMainArgs main_args(m_hInstance);  
    CefRefPtr<SimpleApp> app(new SimpleApp);
    int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
    if (exit_code >= 0)
    {
    	exit(exit_code);
    }
    CefSettings settings;
    CefSettingsTraits::init(&settings);
    settings.no_sandbox = true;
    settings.multi_threaded_message_loop = true;
    CefInitialize(main_args, settings, app.get(), NULL);
    

    在相应的CWebView::OnCreate(LPCREATESTRUCT lpCreateStruct)中生成浏览器窗口

    CefWindowInfo info;  
    CefBrowserSettings settings;  
    cef32_handler = new SimpleHandler(true);
    
    info.SetAsChild(m_hWnd, CRect(0, 0, 1000, 1000));  
    CefBrowserHost::CreateBrowser(info, cef32_handler, CefString("about:blank"), settings, nullptr, nullptr);
    

    在CWebView::OnSize(UINT nType, int cx, int cy)中控制大小适应窗口

    if(cef32_handler.get() && cx > 0 && cy > 0)
    	{
    		CefRefPtr<CefBrowser>browser = cef32_handler->GetBrowser();
    		if(browser)
    		{
    			CefWindowHandle hWnd = browser->GetHost()->GetWindowHandle();
    			if(::IsWindow(m_hWnd)) ::MoveWindow(hWnd, 0, 0, cx, cy, true); 
    		}
    	}
    

    在CMyApp::ExitInstance()中退出CEF

    	CefQuitMessageLoop();
    	CefShutdown();
    

    Debug版本使用CefShutdown()会在debug.log中产生错误报告,Release发行版会忽略。

    运行时所需的文件如下:

    文件名类型说明
    localesfolder本地化资源。CefSettings.locale指定需要加载的pak文件,只需要发布配置的区域对应的pak文件
    cef.pakfile这些文件包含了供CEF使用的区域无关资源,缺少这些文件任意Web组件可能显示不正确
    cef_100_percent.pakfile同上
    cef_200_percent.pakfile同上
    cef_extensions.pakfile此文件包含扩展加载所需的非本地化资源传递--disable-extensions命令行标志来禁止使用文件。没有这个文件,依赖于扩展系统的组件将不起作用, 如PDF查看器
    chrome_elf.dllfileCrash reporting library,崩溃报告
    d3dcompiler_43.dll 或 d3dcompiler_47.dllfileWindows XP/Vista和更高版本的系统需要该文件
    devtools_resources.pakfile此文件包含Chrome开发者工具所需的非本地化资源,缺少这个文件,Chrome开发者工具将无法运行
    icudtl.datfile用来支持unicode,缺少这些文件虽然编译能通过,但是执行CefInitialize();的时候就会崩溃
    libcef.dllfile核心库,要区分Debug和Release
    libEGL.dllfileDirect3D支持文件,如果缺少这些文件,HTML5在渲染2D画布,3D CSS,WebGL时将不起作用
    libGLESv2.dllfile同上
    snapshot_blob.binfileV8引擎快照数据
    v8_context_snapshot.binfile同上

    注:V8引擎是一种JavaScript运行引擎,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。

    cs
    下一篇:没有了