Chromium嵌入式框架:使用“ExecuteFunctionWithContext”时创建对象失败

时间:2012-03-26 21:35:24

标签: delphi chromium chromium-embedded tchromium

概述

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

错误

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

假设

  1. 将参数推送到JavaScript回调适用于TCefv8ValueRef.CreateString和所有其他Cefv8Value类型。
  2. TCefv8ValueRef.CreateObject(nil)函数用作铬扩展的返回值时,它可以正常工作。 (详见Delphi CEF的/demos/guiclient演示)。
  3. TChromium对象保存在主窗体上。
  4. 可能的解决方案和冥想

    1. 我尝试在主窗体上通过TCefv8ValueRef.CreateObject(nil);事件使用OnClick,这也会产生访问冲突。但是,TCefv8ValueRef.CreateString('test');可以正常使用。
    2. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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.   
  3. 在当前上下文以外的上下文中创建V8对象,函数或数组时。例如,如果源自frame1的调用需要修改frame2的上下文。

  4.   

这就是为什么你不能创建一个对象但能够创建js字符串的原因。 你也可以看到the general usage example