在C++Builder6中使用DCEF3嵌入谷歌内核浏览器

历史原因,我有个BCB6写的客户端程序,里面使用了CppWebBrowser控件,众所周知,这个控件是IE内核,对HTML5的兼容性太差,面临很多问题,有些问题即使改注册表将内核版本强制为IE11也解决不了。于是寻找Chrome内核嵌入的替代方案。

一开始走了不少弯路,想直接使用CEF的C++接口,摸索了几天,集成到C++Builder很困难。再后来发现有人将这个框架封装成了Delphi控件,于是想拿来一用。因为这个控件是Delphi的,几乎找不到什么说明文档,弄到BCB6下也有些功能不知道怎么实现--比如POST请求,好在我的应用比较简单,主要是两个最基础的功能:

1、实现url的加载

2、拦截页面的点击请求,对某些请求重新解析并不作导航,比如我们自定义的一些命令,这样可以实现页面和客户端的交互。

实际使用效果不错,下面简单记录一下过程:

1、下载

我是下载的,官网链接就不贴了,请搜索“dcef3-master.zip”

2、下载一个转换工具dpk2bpk.exe,将packages目录下的DCEF_D7.dpk转换成bpk文件

3、将组件工程编译并安装到C++Builder6,注意可能会遇到编译错误:System::PInt64没有定义,统统将其改为64位整型指针:__int64*

新增的组件我主要使用TChromium控件。

4、新创建一个项目,要将src子目录加入你项目的包含目录,如果出现链接错误,将DCEF_D7.lib加入到项目中。默认会增加一个包含文件#include "ceflib.h",不对,需改为ceflib.hpp

5、我在测试时发现一个奇怪问题,新创建一个项目,加入TChromium控件后,再将新项目另存为新名字,再加入一些代码并编译时会出现链接错误:不可用的库 'vcle.lib'

经反复摸索找到的解决方法是,创建新项目后立即先另存为新名字,然后再加入TChromium控件,加代码等,这样编译能顺利通过。


控件的简单使用方法:

1、导航

Chromium1->Load(url);

2、前进、后退,这个简单:

Chromium1->Browser->GoForward();

Chromium1->Browser->GoBack();

3、最关键的请求拦截:

使用OnBeforeBrowse事件,处理request参数:

  AnsiString s2 = request->Url;
  if( memcmp(s2.c_str(), "app:", 4)==0 ){  // 如果是'app:'开头的请求,则拦截下来

    。。。在这里对url字符串进行分解,取出来自行处理
    // cancel the common url navigate and call your c++ code here
    browser->StopLoad();  // 这个关键,停止加载就等于被拦截了

  }



你可能感兴趣的:(实现)