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

CEF closing/resizing issues inside a big application plugin

本文关键字:调整 问题 关闭 CEF 应用程序 插件 大型      更新时间:2023-10-16

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

假设托管我的插件的应用程序框架已经为我的插件创建了一个窗口,并且有自己的消息循环,所以我只能在某种WindowProc中接收事件。我还可以得到窗口的HWND。

我的实现受到了cefssimple示例的启发,因为cefclient太复杂了。我已经用外部可执行文件实现了子流程体系结构,在呈现窗口的客户端区域之前,一切都很好。然后我在关闭窗口(它崩溃了)和交互式调整窗口大小方面遇到了问题(窗口框架被调整了大小,但客户端区域的web视图没有调整大小)。

我试过了所有可能的组合,但我已经没有主意了。即:

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

除了消息处理问题,我可能没有正确关闭浏览器,有什么建议吗?为什么这么复杂?WKWebView太向前了!

没有错误消息,没有堆栈跟踪,没有源代码,没有OS/CEF版本-我怀疑这个问题能否得到回答。

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