CEF关闭/调整大型应用程序插件中的问题

时间:2016-07-21 17:44:11

标签: c++ windows plugins 64-bit chromium-embedded

我正在用C ++编写一个大型x64应用程序的插件。我希望插件打开一个对话框并显示我的网站的Web视图。 我能够在macOS中使用WKWebView,效果很好。在Windows上,我正在评估CEF https://bitbucket.org/chromiumembedded/cef(请让我知道任何替代方案,理想情况下我希望它是基于Webkit的。)

让我们说托管我的插件的应用程序框架已经为我的插件创建了一个窗口并且拥有它自己的消息循环,所以我只能在一种WindowProc中接收事件。我也可以获得窗口的HWND。

我的实现受cefsimple示例的启发,因为cefclient太复杂了。我已经使用外部可执行文件实现了子进程架构,一切正常,直到它呈现窗口的客户区域。然后我有关闭窗口(它崩溃)和交互式调整窗口大小的问题(窗口框架调整大小,但客户区域中的Web视图不会调整大小)。

我已尝试过所有可能的组合,但我已经没有想法了。即:

  • 如果我使用CefRunMessageLoop(),则会正确呈现Web视图,但主应用程序不会处理关闭窗口按钮等UI事件。调整大小不起作用。
  • 如果我偶尔自己调用CefDoMessageLoopWork()(来自WindowProc),Web视图会正确呈现并处理关闭按钮,但它会崩溃。调整大小不起作用。
  • 如果我使用settings.multi_threaded_message_loop = true,则会正确呈现Web视图,我可以关闭窗口而不会崩溃。窗口的析构函数调用CefShutdown()。但如果我试图重新打开窗户,它会崩溃! CefInitialize和CefShutdown只允许调用一次吗? 调整大小仍然不起作用。我不明白为什么在cefsimple示例中调整大小是有效的,在我的窗口中它不起作用。

除了邮件处理问题,我可能没有正确关闭浏览器,有什么建议吗?为什么这么复杂? WKWebView非常简单!

1 个答案:

答案 0 :(得分:0)

没有错误消息,没有堆栈跟踪,没有源代码,没有OS / CEF版本 - 我怀疑这个问题是否可以解答。

我只能告诉你如何干净地关闭浏览器:在正确的时间调用CefShutdown(参见cefclient / cefsimple示例),并且在调用shutdown时不要保留对CEF对象的任何引用。