第一篇文章只是一个前奏,现在开始正题。首先申明的是,我的开发环境是:win7 64位,编译器:vs2013 update4。接着上一篇文章说起,当我们下载好了之后,下载下来的demo,cefclient和cefsimple稍稍改动就能运行。cef运行主要依赖的库就是libcef_dll_wrapper.lib和libcef.lib这俩,现在就开始把简单的那个demo跑起来,我的示例是debug下的。最好先看下我的第一篇文章:点击打开链接
编译器打开后会自动让你升级,单项升级就可以了,完了之后工程自然就是2013的了,如果您看到以下画面:
说明你的工程还是2010的,需要手动升级。那么请工程项目处鼠标右键,出现如下图:
单击方框内选项可升级到如下图
这样就是一个2013的工程了。
现在你去编译这个工程的时候会报链接错误,那是因为libcef_dll_wrapper.lib库你没有添加进去。请编译libcef_dll_wrapper.vcxproj工程,out目录下生成libcef_dll_wrapper.lib库,别说你找不到out目录。然后simple工程将这个库链接上就可以了。我是这么做的:
设置工程链接库
将libcef_dll_wrapper.lib拷贝到debug目录下。然后编译运行:
你试试右键,还有菜单呢~~~
到此为止一个win32窗口的简单demo算是跑起来了,很简单,复杂例子亦如此。接下来就是怎么将复杂例子在MFC中跑起来。一步步来吧:
生成的窗口如下:
中间有个控件和按钮被我删了,其他的我没动。
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下的所有文件全部拷贝到这个目录下,如下图:
在MFC工程下新建一个cefclient文件夹,然后将前面拷贝过来的cefclient文件夹下的所有文件全部添加到这个工程文件夹下里。如下图:
接下来是工程设置:
接下来编译,会报错,凡是打不开resources.h报错的,改为:#include "resource.h"
std::min去掉std::
fopen改为fopen_s,别说你不会改
将原来cef里的resources.h文件里的宏定义全部拷贝到现在MFC工程里的resources.h里,注意有宏重复定义的警告,可以无视
接下来的链接错误改法是将调到 AppGetWorkingDirectory 和AppQuitMessageLoop的函数注释掉,这俩函数原来是cefclient_win.cpp里实现了的函数,此处可以不要了。
到此为止,编译通过。
接下来开始内嵌browser到mfc窗口了........
首先cef的初始化和退出,在CefMFC类里:
然后是CefMFCDlg窗口类里创建浏览器:
通过类向导添加create和size这俩函数,不知道类向导就去百度一下。
到这里代码基本就完了,运行会中断,那是因为改成mfc之后,造成的,这样改:
这些注释了之后,再把相关联的一注释,MFC复杂内嵌就算是搞定了。把复杂例子内嵌进来就是为了后期js和c++互相调用做准备的,这么多代码,强迫症的你觉得好像把垃圾搞进去了,不要乱删除,你怎么知道你后面不用呢?如果你按照我这个步骤还是搞不定的话,那我就无话可说了。很多人在往自己工程里添加cef的时候会忘了将Resources下的资源文件一并拷贝过来,在运行的时候会出现中断,死活找不到问题,一定要小心了。
我特地说明一下,我自己机器上编译的共享MFC DLL版本是能编译运行的,但是到了别人机器上就会编译不过。问题我还没找到,但是静态的版的都没问题,但是你需要这样设置:
附加依赖库:uafxcwd.lib;LIBCMTD.lib;
忽略特定默认库:LIBCMTD.lib;uafxcwd.lib
下一篇文章我将不再讲MFC了,因为目前这个MFC+CEF还是个半成品,后面你得自己丰衣足食了。我会详细讲解cefclient这个复杂的例子,包括js和C++的互相调用,以及UI进程和渲染进程间怎么通信。懂了之后在MFC上,同样运用就可以了。