2016-07-21 37 views
0

Ich schreibe ein Plugin für eine große x64-Anwendung in C++. Ich möchte, dass das Plugin einen Dialog öffnet und eine Webansicht meiner Site anzeigt. Ich konnte WKWebView in Mac OS verwenden und es funktioniert gut. Unter Windows werte ich CEF https://bitbucket.org/chromiumembedded/cef aus (bitte lassen Sie mich eine Alternative wissen, idealerweise möchte ich, dass es auf Webkit basiert).CEF schließen/Größenanpassungen in einem großen Anwendungs-Plugin

Angenommen, das Anwendungsframework, das mein Plugin hostet, hat bereits ein Fenster für mein Plugin erstellt und verfügt über eine eigene Nachrichtenschleife, sodass ich nur Ereignisse in einer Art WindowProc empfangen kann. Ich kann auch die HWND des Fensters bekommen.

Meine Implementierung ist inspiriert von Cefsimple Beispiel, weil Cefclient viel zu kompliziert ist. Ich habe die Subprozessarchitektur mit der externen ausführbaren Datei implementiert und alles funktioniert gut, bis der Clientbereich des Fensters gerendert wird. Dann habe ich Probleme mit dem Schließen des Fensters (es stürzt ab) und die Größe des Fensters interaktiv ändern (der Fensterrahmen wird in der Größe geändert, aber die Webansicht im Client-Bereich ändert nicht die Größe).

Ich habe alle möglichen Kombinationen ausprobiert, aber mir sind die Ideen ausgegangen. Nämlich:

  • Wenn ich CefRunMessageLoop() verwende, wird die Webansicht korrekt gerendert, aber die Hauptanwendung verarbeitet die UI-Ereignisse nicht wie Fenster schließen-Schaltfläche. Die Größenänderung funktioniert nicht.
  • Wenn ich CefDoMessageLoopWork() selbst hin und wieder (von WindowProc) aufrufen, wird die Webansicht korrekt gerendert und es verarbeitet die Schließen-Schaltfläche, aber es stürzt ab. Die Größenänderung funktioniert nicht.
  • Wenn ich settings.multi_threaded_message_loop = true verwenden, wird die Webansicht korrekt gerendert und ich kann das Fenster ohne Absturz schließen. Der Destruktor des Fensters ruft CefShutdown() auf. Aber wenn ich versuche, das Fenster wieder zu öffnen, stürzt es ab! Können CefInitialize und CefShutdown nur einmal aufgerufen werden? Und die Größenänderung funktioniert immer noch nicht. Ich verstehe nicht, warum in der Cefsimple Beispiel Größenänderung funktioniert und in meinem Fenster funktioniert es nicht.
  • Neben Fragen zur Nachrichtenverarbeitung, schließe ich den Browser wahrscheinlich nicht korrekt, irgendwelche Ratschläge? Warum ist das so kompliziert? WKWebView ist so geradlinig!

    Antwort

    0

    Es gibt keine Fehlermeldung, keine Stack-Trace, kein Quellcode, keine OS/CEF-Version - ich bezweifle, dass diese Frage beantwortet werden kann.

    Ich kann Ihnen nur sagen, wie man den Browser sauber schließt: Rufen Sie CefShutdown zur richtigen Zeit auf (siehe Beispiele cefclient/cefsimple) und behalten Sie keine Referenzen auf CEF-Objekte beim Aufruf von shutdown.