# 升级WebBrowser内核

# 从UE4_26升级(失败)

  1. 下载Chromium Embedded Framework (CEF)二进制包,将库复制到Engine\Source\ThirdParty\CEF3目录,并以如下方式命名。

    cef_binary_90.6.7+g19ba721+chromium-90.0.4430.212_windows64

  2. 将上述目录中的Debug或Release下所有文件夹复制到Engine\Binaries\ThirdParty\CEF3\Win64\,如果需要调试则要将对应版本的libcef.dll.pdb拷贝到此文件夹下。

  3. 修改\Source\ThirdParty\CEF3\CEF3.build.cs:

    public CEF3(ReadOnlyTargetRules Target) : base(Target)
    {
            /** Mark the current version of the library */
            //string CEFVersion = "3.3071.1611.g4a19305";
            string CEFVersion = "90.6.7+g19ba721+chromium-90.0.4430.212";
    }
    
    1
    2
    3
    4
    5
    6
  4. 编译libcef_dll_wrapper.lib

    1. 进入Engine\Source\ThirdParty\CEF3\cef_binary_90.6.7+g19ba721+chromium-90.0.4430.212_windows64\libcef_dll目录,在顶部加上cmake_minimum_required(VERSION 3.2)
    2. 运行cmake -G "Visual Studio 16"。
    3. 可能出现错误:CMake Error at CMakeLists.txt:753 (SET_LIBRARY_TARGET_PROPERTIES):Unknown CMake command "SET_LIBRARY_TARGET_PROPERTIES"。此时需要注释掉#SET_LIBRARY_TARGET_PROPERTIES。
    4. 出现Project.sln,用vs2019打开进行编译。
      1. 如果出现错误Cannot open include file: 'libcef_dll/shutdown_checker.h': No such file or directory libcef_dll_wrapper。需要在工程libcef_dll_wrapper属性->C/C++->General->Additional Include Directories:修改值为"$(SolutionDir).."。
      2. 如果出现错误C2589 '(': illegal token on right side of '::' libcef_dll_wrapper。点开发现是std::max,此时是因为工程中包含了windows.h或windef.h头文件,再使用c++标准库std::min或std::max,出现引用错误,要在工程配置中定义NOMINMAX宏,解决办法如下:在工程libcef_dll_wrapper属性-> C/C++ -> Preprocessor -> 在Preprocessor Definitions项中增加NOMINMAX。
    5. 将上面编译好的Debug和Release版本的libcef_dll_wrapper.lib移动到Engine\Source\ThirdParty\CEF3\cef_binary_90.6.7+g19ba721+chromium-90.0.4430.212_windows64\VS2015\libcef_dll中的Debug和Release文件夹下。
  5. 编译UnrealCEFSubProcess,编译时会出现部分C++文件编译不过,因为CEF接口类发生了变化,需要进行修改。

    1. error C3646: “OVERRIDE”: 未知重写说明符。

      解决办法是:在如下文件添加宏定义:

      • Engine\Source\Programs\UnrealCEFSubProcess\Private\UnrealCEFSubProcessRemoteMethodHandler.h
      • Engine\Source\Programs\UnrealCEFSubProcess\Private\UnrealCEFSubProcessApp.h
      #define OVERRIDE override
      #pragma push_macro("OVERRIDE")
      #undef OVERRIDE // cef headers provide their own OVERRIDE macro
      THIRD_PARTY_INCLUDES_START
      
      1
      2
      3
      4
    2. 'SendProcessMessage': is not a member of 'CefBrowser'。

      解决办法是:SendProcessMessage从CefBrowser移动到CefFrame,需使用如下代码:

      browser->GetMainFrame()->SendProcessMessage(PID_BROWSER, msg);

    3. OnProcessMessageReceived did not override any base class methods.

      解决办法是:新版本第二个参数加上了 CefRefPtr<CefFrame> frame

    4. OnRenderThreadCreated was removed from cef。

      解决办法是:remove OnRenderThreadCreated (opens new window),替换为OnBrowserCreated。

    5. 如果出现mismatch detected for 'RuntimeLibrary':value 'MDd_DynamicDebug' doesn't match value 'MD_DynamicRelease' in ...

      解决办法是:回到编译libcef_dll_wrapper.lib的这个工程中,在右键->属性->C/C++->Code Generation->RuntimeLibrary设置为/MD。

  6. 编译UE4源码

    1. 需要勾选.Net Framework 4.6.2开发工具。
    2. 运行setup.bat下来依赖,生成.sln解决方案。可使用命令行.\Setup.bat -exclude=linux -exclude=IOS来排除某些不需要的模块。
    3. 双击GenerateProjectFiles.bat生成sln解决方案。
    4. 打开sln解决方案,Solution Configuration选择Development Editor,平台选择Win64,然后点build。
  7. 编译UE4源码遇到的错误:

    1. error C3646: “OVERRIDE”: 未知重写说明符。 解决办法是:在如下文件添加宏定义 #define OVERRIDE override:
      • Engine\Source\Runtime\WebBrowser\Private\CEF/CEFBrowserApp.h
      • Engine\Source\Runtime\WebBrowser\Private\CEF/CEFBrowserByteResource.h
      • Engine\Source\Runtime\WebBrowser\Private\CEF/CEFBrowserHandler.h
      • Engine\Source\Runtime\WebBrowser\Private\CEF\CEFBrowserClosureTask.h
      • Engine/Source/Runtime/WebBrowser/Private/CEF/CEFCookieManager.cpp
      • Engine/Source/Runtime/WebBrowser/Private/CEF/CEFSchemeHandler.cpp
      • Engine/Source/Runtime/WebBrowser/Private/CEF/CEFWebBrowserWindow.cpp

# 从UE5源码升级(失败)

上面进行到最后一步后,要更新UE4的源码,实在是工作量有点大,这个时候UE5的源码发布了,然后就在想能否把UE5的CEF这部分代码放到UE4中。

  1. 编译libcef_dll_wrapper.lib。
  2. 编译UE4源码。