从那里下载Cef3的资源?
Cef3的各个版本下载地址:https://bitbucket.org/chromiumembedded/cef。这个地址不用翻墙就可以下载,但都是最近的版本,老版本的下载地址已经找不到了… 最后一个支持windowsXP的版本是3.2623,我用的也是这个版本。下载地址在这里:http://pan.baidu.com/s/1jIgLoaU。 debug版本的资源有七百多兆,需要的朋友可以联系我。
怎么在windows上编译cef3?
下载一个Cmake工具即可轻松生成sln文件,打开编译即可,可能会报错编译不通过,将警告视为错误选项修改为 否即可,这里默认是将警告视为错误的;
打开解决方案资源管理器如图所示:
libcef_dll_wrapper 是在讲libcef的C接口做了一个C++的封装,我们调用的时候使用的将是libcef_dll_wrapper的C++接口,cefsimple是cef3嵌入到MFC的一个简单实例,cefclient则是一个全面的Cef3的功能实现,我们自己开发功能的时候也多是参照这个工程来改,但更具体的实现还是需要自己动手。关于怎么在windows上配置Cef3的这个工程,网上的资料多如牛毛,我这里就不再累赘了。我这里里主要讲解如何将Cef3内嵌浏览器的功能封装成一个Duilib的浏览器空间来使用,实现了有关接口回调到最上层应用,C++和浏览器的js相互调用等功能,具体如何,各位看官长眼:
想在自己的工程中添加Cef浏览器,首先要在程序入口处调用Cef的初始化操作,我们将这个接口封装到静态函数中,以保证在main函数中就能调用到;
//高DPI支持
CefEnableHighDPISupport();
//没有实现沙箱
void* sandbox_info = NULL;
CefMainArgs main_args(hInstance);
CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
command_line->InitFromString(::GetCommandLineW());
if (!PathIsDirectory(cache_path.ToWString().c_str())) {
SHCreateDirectory(NULL, cache_path.ToWString().c_str());
}
if (!PathIsDirectory(log_file.ToWString().c_str())) {
SHCreateDirectory(NULL, log_file.ToWString().c_str());
}
//不同进程创建不同的app
CefRefPtr<CefApp> app; reeiss_cef::ProcessType process_type = ClientApp::GetProcessType(command_line);
if (process_type == reeiss_cef::BrowserProcess) {
app = new ClientAppBrowser();
}
else {
return false;
}
//这里是对Cef的一些全局设置
CefSettings settings; CefSettingsTraits::init(&settings);
//这个设置能实现单进程运行Cef浏览器插件,我们实际应用中采用的是双进程模式,即一个主进程,一个render渲染进程
//settings.single_process = true;settings.no_sandbox = true;
//设置渲染进程的名称,因为在相同目录下,没有指定路径
CefString(&settings.browser_subprocess_path).FromWString(L"Render.exe");
//禁用Cef的消息循环,采用DuiLib的消息循环
settings.multi_threaded_message_loop = true;
//设置本地语言
CefString(&settings.locale).FromWString(L"zh-CN");
//缓存数据路径
CefString(&settings.cache_path).FromWString(cache_path);
//debug日志路径
CefString(&settings.log_file).FromWString(log_file);
//初始化cef的全局操作
CefInitialize(main_args, settings, app.get(), sandbox_info);
return true;
当程序结束运行时,需要调用CefShutdown();接口来释放资源,如果没有调用这个的话,可能会出现进程假死的状态,将这两个接口放在一起,在main函数开始时调用初始化,在结束处调用关闭,即可安全的在程序中创建浏览器控件了。