3

概述

我在 Delphi 2009 上使用铬嵌入式框架 (cef),它是最新版本。

错误

我可以使用它ExecuteFunctionWithContext来成功执行 JavaScript 回调例程,并且可以为它提供参数。但是,当我尝试使用时, libcef库中发生TCefv8ValueRef.CreateObject(nil);访问冲突。

假设

  1. 将参数推送到 JavaScript 回调适用于TCefv8ValueRef.CreateString所有其他Cefv8Value类型。
  2. TCefv8ValueRef.CreateObject(nil)函数在用作铬扩展的返回值时工作正常。/demos/guiclient(如Delphi 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 当前不在上下文中,或者如果您需要检索和存储对上下文的引用,则可以使用两种可用的 CefV8Context 静态方法之一。GetCurrentContext() 返回当前正在执行 JS 的框架的上下文。GetEnteredContext() 返回开始执行 JS 的帧的上下文。例如,如果 frame1 中的函数调用 frame2 中的函数,则当前上下文将为 frame2,输入的上下文将为 frame1。

如果 V8 在上下文中,则只能创建、修改和执行数组、对象和函数(如果是函数)。如果 V8 不在上下文中,则应用程序需要通过调用 Enter() 进入上下文并通过调用 Exit() 退出上下文。Enter() 和 Exit() 方法只能用于:

  1. 在现有上下文之外创建 V8 对象、函数或数组时。例如,在创建 JS 对象以响应本机菜单回调时。

  2. 在当前上下文之外的上下文中创建 V8 对象、函数或数组时。例如,如果来自 frame1 的调用需要修改 frame2 的上下文。

所以这就是为什么你不能创建对象但能够创建 js 字符串的原因。您还可以看到一般用法示例

于 2013-10-01T07:00:06.700 回答