2012-03-26 12 views
3

ÜbersichtChromium Embedded Rahmen: ein Objekt erstellen schlägt fehl, wenn mit "ExecuteFunctionWithContext"

I Chrom eingebettet Rahmen verwenden (CEF) auf Delphi 2009 ist die neueste Version.

Fehler

kann ich ExecuteFunctionWithContext erfolgreich eine JavaScript-Callback-Routine auszuführen, und ich es mit Argumenten versorgen kann. Wenn ich jedoch versuche und TCefv8ValueRef.CreateObject(nil); eine Zugriffsverletzung verwenden tritt in der libcef Bibliothek.

Annahmen

  1. ein Argument an den Rückruf JavaScript Pushing arbeiten für TCefv8ValueRef.CreateString und alle anderen Cefv8Value Typen.
  2. Die Funktion funktioniert einwandfrei, wenn sie als Rückgabewert für eine Chromverlängerung verwendet wird. (Wie in der /demos/guiclient Demo für das Delphi CEF ausführlich beschrieben).
  3. Das Objekt TChromium befindet sich auf dem Hauptformular.

Mögliche Lösungen und Musings

  1. ich versucht habe TCefv8ValueRef.CreateObject(nil); über eine OnClick Veranstaltung auf dem Hauptformular, das produzierte auch eine Zugriffsverletzung auf. TCefv8ValueRef.CreateString('test'); funktioniert jedoch einwandfrei.

Jede Hilfe würde sehr geschätzt werden.

+1

haben Sie versucht: TCefv8ValueRef.CreateObject (TCefv8ValueRef.CreateUndefined) –

+0

Das hat nicht funktioniert, es gab immer noch eine Zugriffsverletzung Fehler. – Hzmy

Antwort

0

Ich hatte das gleiche Problem auf C++! Und ich habe es mit folgendem Code gelöst:

CefRefPtr<CefFrame> frame = browser->GetMainFrame(); 
CefRefPtr<CefV8Context> v8Context = frame->GetV8Context(); 
if (v8Context.get() && v8Context->Enter()) 
{ 
    CefRefPtr<CefV8Value> object = CefV8Value::CreateObject(NULL); 
    // ExecuteFunctionWithContext and other actions 

    v8Context->Exit(); 
} 

Die chromiumembedded Dokumentation enthält folgende:

So können Sie auf der rechten Seite contect vor Ihren Aktionen mit Javascript-Modell wechseln sollten. Wenn sich V8 derzeit nicht in einem Kontext befindet oder wenn Sie einen Verweis auf einen Kontext abrufen und speichern müssen, können Sie eine der beiden verfügbaren statischen CefV8Context-Methoden verwenden. GetCurrentContext() gibt den Kontext für den Frame zurück, der gerade JS ausführt. GetEnteredContext() gibt den Kontext für den Frame zurück, in dem die JS-Ausführung begonnen hat. Wenn beispielsweise eine Funktion in frame1 eine Funktion in frame2 aufruft, ist der aktuelle Kontext frame2 und der eingegebene Kontext ist frame1.

Arrays, Objekte und Funktionen dürfen nur erstellt, verändert und im Falle von Funktionen ausgeführt werden, wenn sich V8 in einem Kontext befindet. Wenn sich V8 nicht in einem Kontext befindet, muss die Anwendung einen Kontext eingeben, indem sie Enter() aufruft und den Kontext durch Aufrufen von Exit() beendet. Die Eingabe() und Beenden() Verfahren nur verwendet werden sollte:

  1. Beim Erstellen eines V8-Objekt, Funktion oder Array außerhalb eines vorhandenen Kontext.Zum Beispiel beim Erstellen eines JS-Objekts als Reaktion auf einen nativen Menü-Callback.

  2. Beim Erstellen eines V8-Objekts, einer Funktion oder eines Arrays in einem anderen Kontext als dem aktuellen Kontext. Zum Beispiel, wenn ein aus Frame1 stammender Aufruf den Kontext von Frame2 ändern muss.

Also das ist, warum Sie nicht ein Objekt erstellen konnte, konnte aber js Strings erstellen. Auch Sie konnten the general usage example sehen.