libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现

第一篇文章只是一个前奏,现在开始正题。首先申明的是,我的开发环境是:win7 64位,编译器:vs2013 update4。接着上一篇文章说起,当我们下载好了之后,下载下来的demo,cefclient和cefsimple稍稍改动就能运行。cef运行主要依赖的库就是libcef_dll_wrapper.lib和libcef.lib这俩,现在就开始把简单的那个demo跑起来,我的示例是debug下的。最好先看下我的第一篇文章:点击打开链接

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第1张图片

编译器打开后会自动让你升级,单项升级就可以了,完了之后工程自然就是2013的了,如果您看到以下画面:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第2张图片

说明你的工程还是2010的,需要手动升级。那么请工程项目处鼠标右键,出现如下图:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第3张图片

单击方框内选项可升级到如下图

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第4张图片

这样就是一个2013的工程了。


现在你去编译这个工程的时候会报链接错误,那是因为libcef_dll_wrapper.lib库你没有添加进去。请编译libcef_dll_wrapper.vcxproj工程,out目录下生成libcef_dll_wrapper.lib库,别说你找不到out目录。然后simple工程将这个库链接上就可以了。我是这么做的:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第5张图片

设置工程链接库

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第6张图片

将libcef_dll_wrapper.lib拷贝到debug目录下。然后编译运行:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第7张图片

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第8张图片

你试试右键,还有菜单呢~~~


到此为止一个win32窗口的简单demo算是跑起来了,很简单,复杂例子亦如此。接下来就是怎么将复杂例子在MFC中跑起来。一步步来吧:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第9张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第10张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第11张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第12张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第13张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第14张图片

生成的窗口如下:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第15张图片

中间有个控件和按钮被我删了,其他的我没动。

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第16张图片

1. 将下载的cef的复杂例子cefclient拷贝过来放在工程这个位置,只要cpp和h文件,cefclient_win.cpp不要了,这是win32下的,还有一个叫resource.h也不要了,因为mfc工程是有这个资源文件的。

2.将下载的cef的include文件夹整个拷贝过来,放在该位置。

3. 新建一个bin文件夹,将下载的cef的debug目录下的全部拷贝到bin目录下,将cef的out目录下的libcef_dll_wrapper.lib也拷贝到该目录,将cef的资源文件夹Resources下的所有文件全部拷贝到这个目录下,如下图:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第17张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第18张图片

在MFC工程下新建一个cefclient文件夹,然后将前面拷贝过来的cefclient文件夹下的所有文件全部添加到这个工程文件夹下里。如下图:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第19张图片

接下来是工程设置:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第20张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第21张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第22张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第23张图片libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第24张图片

接下来编译,会报错,凡是打不开resources.h报错的,改为:#include "resource.h"

std::min去掉std::

fopen改为fopen_s,别说你不会改

将原来cef里的resources.h文件里的宏定义全部拷贝到现在MFC工程里的resources.h里,注意有宏重复定义的警告,可以无视

接下来的链接错误改法是将调到 AppGetWorkingDirectory 和AppQuitMessageLoop的函数注释掉,这俩函数原来是cefclient_win.cpp里实现了的函数,此处可以不要了。

到此为止,编译通过。

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第25张图片

接下来开始内嵌browser到mfc窗口了........

首先cef的初始化和退出,在CefMFC类里:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第26张图片


libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第27张图片


libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第28张图片

然后是CefMFCDlg窗口类里创建浏览器:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第29张图片

通过类向导添加create和size这俩函数,不知道类向导就去百度一下。

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第30张图片


libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第31张图片

到这里代码基本就完了,运行会中断,那是因为改成mfc之后,造成的,这样改:

libcef学习最详细的入门资料系列之二 :libcef的编译和运行,以及MFC下的实现_第32张图片

这些注释了之后,再把相关联的一注释,MFC复杂内嵌就算是搞定了。把复杂例子内嵌进来就是为了后期js和c++互相调用做准备的,这么多代码,强迫症的你觉得好像把垃圾搞进去了,不要乱删除,你怎么知道你后面不用呢?如果你按照我这个步骤还是搞不定的话,那我就无话可说了。很多人在往自己工程里添加cef的时候会忘了将Resources下的资源文件一并拷贝过来,在运行的时候会出现中断,死活找不到问题,一定要小心了。

我特地说明一下,我自己机器上编译的共享MFC DLL版本是能编译运行的,但是到了别人机器上就会编译不过。问题我还没找到,但是静态的版的都没问题,但是你需要这样设置:

附加依赖库:uafxcwd.lib;LIBCMTD.lib;
忽略特定默认库:LIBCMTD.lib;uafxcwd.lib

下一篇文章我将不再讲MFC了,因为目前这个MFC+CEF还是个半成品,后面你得自己丰衣足食了。我会详细讲解cefclient这个复杂的例子,包括js和C++的互相调用,以及UI进程和渲染进程间怎么通信。懂了之后在MFC上,同样运用就可以了。

你可能感兴趣的:(libcef)