概述
我在Delphi 2009上使用chrome嵌入式框架(cef),它是最新版本。
错误
我可以使用ExecuteFunctionWithContext
成功执行JavaScript回调例程,我可以为它提供参数。
但是,当我尝试使用TCefv8ValueRef.CreateObject(nil);
时, libcef 库中会出现访问冲突。
假设
TCefv8ValueRef.CreateString
和所有其他Cefv8Value
类型。TCefv8ValueRef.CreateObject(nil)
函数用作铬扩展的返回值时,它可以正常工作。 (详见Delphi CEF的/demos/guiclient
演示)。 TChromium
对象保存在主窗体上。可能的解决方案和冥想
TCefv8ValueRef.CreateObject(nil);
事件使用OnClick
,这也会产生访问冲突。但是,TCefv8ValueRef.CreateString('test');
可以正常使用。非常感谢任何帮助。
答案 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()方法:
在现有上下文之外创建V8对象,函数或数组时。例如,在创建JS对象以响应本机菜单回调时。
- 醇>
在当前上下文以外的上下文中创建V8对象,函数或数组时。例如,如果源自frame1的调用需要修改frame2的上下文。
这就是为什么你不能创建一个对象但能够创建js字符串的原因。 你也可以看到the general usage example。