【问题标题】:Make CEF use separate executable to launch subprocesses (C++/Windows)使 CEF 使用单独的可执行文件来启动子进程 (C++/Windows)
【发布时间】:2016-12-19 13:33:09
【问题描述】:

我正在尝试修改 Chromium Embedded Framework (https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial) 中的“cefsimple”示例,以便它使用单独的可执行文件来在 Windows 上启动其子进程。

但是,这并没有按预期工作,并且每次在主进程中调用 CefInitialize 时,在弹出任何窗口或启动任何子进程之前都会崩溃。调用堆栈:

    chrome_elf.dll!00007ffaa7fc1cfd()   
    chrome_elf.dll!00007ffaa7fba5fc()   
    chrome_elf.dll!00007ffaa7fb9c9b()   
    libcef.dll!00007ffa88dae13c()   
    libcef.dll!00007ffa882fc146()   
>   cefsimple.exe!CefInitialize(const CefMainArgs & args, const CefStructBase<CefSettingsTraits> & settings, CefRefPtr<CefApp> * application, void * windows_sandbox_info)  Line 201 + 0xb4 bytes   C++

使用:CEF 版本 3.2883.1539、64 位、C++、VS 2015、Windows 10。

我的解决方案: 我在 CMakeLists 中添加了另一个目标(cefsimpleHelper.exe),并使用这些说明作为参考来修改源代码: https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-separate-sub-process-executable

cefsimple_win.cc: (主可执行文件的入口点)

int APIENTRY wWinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR    lpCmdLine,
                      int       nCmdShow)
{
  UNREFERENCED_PARAMETER(hPrevInstance);
  UNREFERENCED_PARAMETER(lpCmdLine);

  CefEnableHighDPISupport();
  CefMainArgs main_args(hInstance);

  CefSettings settings;
  settings.no_sandbox = true;
  CefString(&settings.browser_subprocess_path).FromASCII("cefsimpleHelper.exe");

  CefRefPtr<SimpleApp> app(new SimpleApp);

  CefInitialize(main_args, settings, app.get(), NULL);
  CefRunMessageLoop();
  CefShutdown();

  return 0;
}

process_helper_win.cc: (子进程启动器的入口点)

int APIENTRY wWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    CefMainArgs main_args(hInstance);
    CefRefPtr<SimpleApp> app(new SimpleApp);
    return CefExecuteProcess(main_args, app.get(), nullptr);
}

任何想法可能是什么问题?

【问题讨论】:

  • 你可以尝试调试一下,找出是哪一行CEF/Chromium源代码导致了crash。您只需要来自 cefbuilds.com 的调试符号和来自bitbucket.org/chromiumembedded/cef 的 CEF 源代码。您可能也需要 Chromium 代码。这有点棘手,但这里有一条指令:chromium.org/developers/how-tos/get-the-code
  • 您的主 exe 正在启动两次,第二次是新的 crashpad 进程,查看问题跟踪器了解详细信息,有一个未解决的问题。 chrome_elf.dll 是专门为 crashpad 支持而添加的。

标签: c++ windows process chromium-embedded


【解决方案1】:

我想我找到了解决方案,主要是通过随机试验和错误:P

我刚刚在主可执行文件中的 CefInitialize 之前添加了对 CefExecuteProcess 的调用:

const auto exit_code = CefExecuteProcess(main_args, app.get(), nullptr);
if (exit_code >= 0)
    return exit_code;

感谢所有cmets,我希望这对其他人也有帮助。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2017-11-23
    • 2010-09-07
    • 1970-01-01
    • 2020-05-19
    • 2020-01-01
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多