CEF完整嵌入DUI窗体(二) --在程序中初始化Cef

从那里下载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函数开始时调用初始化,在结束处调用关闭,即可安全的在程序中创建浏览器控件了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值