栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LibCef中的一些坑

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LibCef中的一些坑

  1. 网上的教程里给的libcef官网基本都失效了(比如libcef学习最详细的入门资料系列之一 :libcef基本的入门知识_StrokeAce的博客-CSDN博客_libcef里的链接和下面的镜像) ,需要自己去Google搜索libCEF下载。
  2. 这个网站有部分源码和问答,但没有对应的libcef.dll下载chromiumembedded / cef — Bitbucket。
  3. 下载下来以后编译libcef_dll_wrapper工程生成lib。需要注意的是默认在工程的C++选项/预处理器中加了_HAS_ITERATOR_DEBUGGING=0以及C++选项/代码生成/运行库的选项,如果编译不过则看需求修改。
  4. 编译cefSimple,这是一个最简单的应用,然后可以根据需要修改simple_handler在其它工程里使用。
  5. 在mfc中使用libcef加载网页失败,报错net service crashed和gpu process crashed.最终按照将Libcef打造为win32控件(非MFC) - 简书 (jianshu.com) 里的方法解决了。可以不在主程序里修改启动参数,libcef自带修改启动参数功能。
class ArgsCefApp : public CefApp
{
public:
    ArgsCefApp() {};
    virtual void OnBeforeCommandLineProcessing(const CefString& process_type,CefRefPtr command_line);
    IMPLEMENT_REFCOUNTING(ArgsCefApp);
};
void ArgsCefApp::OnBeforeCommandLineProcessing(const CefString& process_type, CefRefPtr command_line)
{
    auto arg = command_line->GetCommandLineString().ToString();
    int index = arg.find(" --");
    arg.insert(index < 0 ? arg.size() : index, " -no-proxy-server -single-process -disable-logging");
    command_line->InitFromString(arg.c_str());
}
//在对话框中创建libcef窗口的流程
{
	CefSettings settings;
	CefSettingsTraits::init(&settings);
	settings.multi_threaded_message_loop = true;

	CefMainArgs mainArgs;
	CefRefPtr cefApp = new ArgsCefApp();//在这里使用继承类
	CefInitialize(mainArgs, settings, cefApp, NULL);

	RECT rect;
	GetClientRect(&rect);
	CefRect rectnew(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
	CefWindowInfo winInfo;
	winInfo.SetAsChild(GetSafeHwnd(), rectnew);

	m_simpleHandler = new SimpleHandler();
	CefBrowserSettings browserSettings;
	CefBrowserHost::CreateBrowser(winInfo, m_simpleHandler, _T("www.baidu.com"), browserSettings, nullptr, nullptr);
}
  1. 项目中需要执行脚本,但是脚本必须在页面加载完成之后执行,所以采用如下方式实现。首先增加一个记录是否加载完成的参数,在OnLoadingStateChange修改。然后执行脚本时判断如果加载完成直接执行,否则保存脚本字符串在OnLoadEnd中执行。
void SimpleHandler::runScript(CefString script)
{
    if(m_loading)
        m_script = script;
    else if (browser_list_.size() > 0)
        browser_list_.back()->GetMainFrame()->ExecuteJavaScript(m_script, "", 0);
}
void SimpleHandler::OnLoadEnd(CefRefPtr browser,
    CefRefPtr frame,int httpStatusCode)
{
    //m_loading = false;
    if (!m_script.empty())
    {
        frame->ExecuteJavaScript(m_script, "", 0);
        m_script.clear();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/974931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号