Overview
我在 Delphi 2009 上使用 chromium 嵌入式框架(cef),它是最新版本。
Error
我可以用ExecuteFunctionWithContext
成功执行 JavaScript 回调例程,我可以为其提供参数。
但是,当我尝试使用TCefv8ValueRef.CreateObject(nil);
an 访问冲突发生在libcef图书馆。
假设
- 将参数推送到 JavaScript 回调适用于
TCefv8ValueRef.CreateString
和所有其他的Cefv8Value
types.
- The
TCefv8ValueRef.CreateObject(nil)
当函数用作 chromium 扩展的返回值时,它可以正常工作。 (正如详细的/demos/guiclient
Delphi CEF 演示)。
- The
TChromium
对象保存在主窗体上。
可能的解决方案和思考
- 我尝试过使用
TCefv8ValueRef.CreateObject(nil);
via an OnClick
主窗体上的事件,这也产生了访问冲突。然而,TCefv8ValueRef.CreateString('test');
会工作得很好。
任何帮助将不胜感激。
我在 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字符串的原因。
你还可以看到一般用法示例 https://code.google.com/p/chromiumembedded/wiki/JavaScriptIntegration#General_Usage.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)