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

来源:互联网 发布:河北秦淮数据有限公司 编辑:程序博客网 时间:2024/05/21 06:59

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

原创粉丝点击