3

概要

Delphi 2009でクロム埋め込みフレームワーク(cef)を使用しています。これは、最新のリリースです。

エラー

JavaScriptコールバックルーチンを正常に実行するために使用ExecuteFunctionWithContextでき、引数を指定できます。ただし、使用しようとするとTCefv8ValueRef.CreateObject(nil);libcefライブラリでアクセス違反が発生します。

仮定

  1. JavaScriptコールバックへの引数のプッシュはTCefv8ValueRef.CreateString、他のすべてのCefv8Valueタイプで機能します。
  2. このTCefv8ValueRef.CreateObject(nil)関数は、クロム拡張の戻り値として使用されると正常に機能します。(/demos/guiclientDelphi CEFのデモで詳しく説明されています)。
  3. TChromiumオブジェクトはメインフォームに保持されます。

考えられる解決策と考え

  1. TCefv8ValueRef.CreateObject(nil);メインフォームのイベントを介して使用しようとしOnClickましたが、これもアクセス違反を引き起こしました。ただし、TCefv8ValueRef.CreateString('test');正常に動作します。

どんな助けでも大歓迎です。

4

1 に答える 1

0

C++ でも同じ問題が発生しました。そして、次のコードで解決しました:

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();
}

chromiumembedded のドキュメントには次のものが含まれています。

そのため、JavaScript モデルを使用してアクションを実行する前に、適切なコンテキストをオンにする必要があります。V8 が現在コンテキスト内にない場合、またはコンテキストへの参照を取得して保存する必要がある場合は、2 つの使用可能な CefV8Context 静的メソッドのいずれかを使用できます。GetCurrentContext() は、現在 JS を実行しているフレームのコンテキストを返します。GetEnteredContext() は、JS の実行が開始されたフレームのコンテキストを返します。たとえば、フレーム 1 の関数がフレーム 2 の関数を呼び出す場合、現在のコンテキストはフレーム 2 になり、入力されたコンテキストはフレーム 1 になります。

配列、オブジェクト、および関数は、V8 がコンテキスト内にある場合にのみ、作成、変更、および関数の場合は実行できます。V8 がコンテキスト内にない場合、アプリケーションは Enter() を呼び出してコンテキストに入り、Exit() を呼び出してコンテキストを終了する必要があります。Enter() および Exit() メソッドは、次の場合にのみ使用してください。

  1. 既存のコンテキスト外で V8 オブジェクト、関数、または配列を作成する場合。たとえば、ネイティブ メニュー コールバックに応答して JS オブジェクトを作成する場合です。

  2. 現在のコンテキスト以外のコンテキストで V8 オブジェクト、関数、または配列を作成する場合。たとえば、frame1 から発信された呼び出しで、frame2 のコンテキストを変更する必要があるとします。

そのため、オブジェクトを作成できませんでしたが、js 文字列を作成できました。また、一般的な使用例もご覧いただけます。

于 2013-10-01T07:00:06.700 に答える