2016-07-21 4 views
0

Я пишу плагин для большого приложения x64 на C++. Я хочу, чтобы плагин открыл диалоговое окно и отобразил веб-представление моего сайта. Я был в состоянии использовать WKWebView в macOS, и он работает хорошо. В Windows я оцениваю CEF https://bitbucket.org/chromiumembedded/cef (пожалуйста, дайте мне знать любую альтернативу, в идеале я бы хотел, чтобы она была основана на Webkit).Проблемы с закрытием/изменением CEF внутри большого плагина приложения

Предположим, что инфраструктура приложения, на котором размещается мой плагин, уже создала окно для моего плагина и имеет собственный цикл сообщений, поэтому я могу получать события только в виде WindowProc. Я также могу получить HWND окна.

Моя реализация вдохновлена ​​примером cefsimple, потому что cefclient слишком сложна. Я реализовал архитектуру подпроцесса с внешним исполняемым файлом, и все работает нормально, пока оно не отображает клиентскую область окна. Затем у меня проблемы с закрытием окна (он падает) и изменение размера окна в интерактивном режиме (размер окна изменяется, но веб-представление в клиентской области не изменяется).

Я пробовал все возможные комбинации, но у меня кончились идеи. А именно:

  • Если я использую CefRunMessageLoop(), веб-представление отображается правильно, но основное приложение не обрабатывает события пользовательского интерфейса, например кнопку закрытия окна. Изменение размера не работает.
  • Если я вызываю CefDoMessageLoopWork() сам раз в то время (из WindowProc), веб-представление обрабатывается правильно и обрабатывает кнопку закрытия, но сбой. Изменение размера не работает.
  • Если я использую settings.multi_threaded_message_loop = true, веб-представление отображается правильно, и я могу закрыть окно без сбоев. Деструктор окна вызывает CefShutdown(). Но если я попытаюсь открыть окно, он сработает! CefInitialize и CefShutdown разрешено вызывать только один раз? И изменение размера еще не работает. Я не понимаю, почему в примерах изменения размеров работает, и в моем окне это не работает.

Помимо проблем с обработкой сообщений, возможно, я не закрываю браузер правильно, никаких советов? Почему так сложно? WKWebView так страшен!

ответ

0

Нет сообщения об ошибке, нет трассировки стека, нет исходного кода, нет версии ОС/CEF. Я сомневаюсь, что на этот вопрос можно ответить.

Я могу только сказать вам, как закрыть браузер: вызовите CefShutdown в нужное время (см. Примеры cefclient/cefsimple) и не держите ссылки на объекты CEF при вызове shutdown.