将Libcef打造为win32控件(非MFC)

Libcef 的完整发行包中自带示例代码,可以用cmake生成工程后编译运行。我的目的将cefclient编译为DLL,由它与libcef打交道,最终的exe与所有dll互无编译依赖,通过 GetProcAddress 动态对接。

参考:notepad++插件、miniblink-wke控件的实现。

首先,编译 cefclient.exe,记得关闭“treat warning as error”。关闭这种选项在项目设置里的"all options"中搜索即可。

编译成功后,显示出有几个按钮、一些菜单的简单浏览器界面。

2020年了,LIBCEF的演示项目一上来就三个问题:

  • 默认会搜索代理服务器,当打开 ie设置->互联网->链接->局域网设置->自动检测设置时,启动相当慢,需要6秒左右。

  • 默认是"多进程模式",对于一个控件来说,未免太过怪异与奢侈了点。

  • 会记录log文件,而且启动有弹窗提示。


    自动检测设置

解决前两个问题,需要在程序启动参数中追加参数开关--no-proxy-server --single-process。多进程模式下,新启动的进程会重复几次进入wWinMain入口,而且自带参数,可以打印查看:

多进程参数,应该是来自CHROMIUM代码,不受LIBCEF控制,但可通过设置`cefsettings.command_line_args_disabled`来忽略

若想要直接在程序中嵌入参数,也不是没有办法。因为GetCommandLine返回的字符串是可以修改的:

  auto cmd = GetCommandLine();
  auto idx=wcsstr(cmd, L"\" --");
  if(idx)
  {
      idx=idx+1;
  }
  else
  {
      // todo boundary check
      idx = cmd+lstrlen(cmd);
  }
  if(idx)
  {
      lstrcpy(idx, TEXT(" -no-proxy-server -single-process -disable-logging"));
  }
// 在 CefExecuteProcess 之前调用

这一点恐怕没人想得到吧,不过可能有潜在的数组越界问题。

解决问题三就简单的多了,直接修改cefsetting结构,关闭log即可。

CefSettings settings;
// context->PopulateSettings(&settings); // 不要用这句,骗小孩子的玩意。
settings.log_severity=LOGSEVERITY_DISABLE;

吐槽一下CMAKE,生成的项目真是一团糟,一模一样的运行库复制了好几遍,一下子就浪费近一个G。CMAKE不是生成了就拍一拍衣袖深藏功与名的那种,而是存留了很多莫名其妙的CustomBuild与安装指令,事实上把这些CMAKE余孽全部删掉都没有问题。

CMAKE最大的问题:生成的vs项目里全部都是绝对路径,目录一搬就出错。如果是相对路径,直接把解决方案上传github都没有问题,别人打开就可以编译,哪里用得着CMAKE?

未完待续……

下一篇:初次封装,拿到浏览器HWND

你可能感兴趣的:(将Libcef打造为win32控件(非MFC))