【问题标题】:Error adding SCRIPTITEM_CODEONLY symbol using IE9 JS engine (Chakra)使用 IE9 JS 引擎 (Chakra) 添加 SCRIPTITEM_CODEONLY 符号时出错
【发布时间】:2013-07-04 14:18:55
【问题描述】:

一段时间以来,我们一直在浏览器扩展 (BHO) 中使用旧的 JScript 引擎 (CLSID_JScript) 中的活动脚本,最近我们决定也支持新的 IE9 脚本引擎 (Chakra)。我们要做的一件事是使用AddNamedItemSCRIPTITEM_CODEONLY 选项向引擎添加符号,以创建我们自己的模块(命名空间)。不幸的是,我们无法让它与 Chakra 一起工作。即使是我们添加符号并立即检索其脚本调度的最简单的示例也会产生E_OUTOFMEMORY 错误。

if (SUCCEEDED(hr)) {
  hr = scriptEngine->AddNamedItem(L"test", SCRIPTITEM_CODEONLY);
}
if (SUCCEEDED(hr)) {
   hr = scriptEngine->GetScriptDispatch(L"test", &scriptDispatch);
}

GetScriptDispatch 调用返回错误。你可以看到整个例子on Github

我在所有IActiveScriptSite 方法上都设置了断点,唯一被调用的是GetLCIDOnStateChange,所以不要认为站点实现是问题所在。

我查看了我能找到的每个示例并尝试了所有我能想到的方法,包括手动将引擎状态设置为 SCRIPTSTATE_CONNECTED,实现它所支持的任何其他接口等等。我什至尝试返回一个有效的 @ 987654332@。似乎没有什么不同。

知道什么给了?我认为这个基本示例应该适用于 Chakra。

【问题讨论】:

  • 看起来 SCRIPTITEM_GLOBALMEMBERS 有帮助,但它有副作用。测试环境是 Windows 8.1/IE11。我建议您在 connect.microsoft.com/IE 上触发一个错误。
  • 我们几天前提交了:connect.microsoft.com/IE/feedback/details/792455/…。仍在等待反馈,但听起来我们现在可能不走运。我们正在为我们的用例寻找一种可能的解决方法。

标签: internet-explorer-9 bho jscript chakra iactivescript


【解决方案1】:

不幸的现实是,Chakra 公开的 IActiveScript 接口集并非供公众使用。 (正是因为这个原因,GUID 没有发布到注册表中。)Chakra 只实现了支持 Internet Explorer 和 Visual Studio 编辑器/调试器所需的 IActiveScript 接口部分,并且没有努力确保完整性或正确性超出这两个客户端使用的接口。

看起来您的场景是未按照规范实现的场景之一,可能是因为 IE/VS 没有以这种特定方式使用接口。遗憾的是,除非决定在未来的某个 IE 版本中公开支持 IActiveScript 接口,否则几乎不可能修复此问题。

IE11 为 Chakra 引入了一个公共 API,但它不是基于 IActiveScript,而是基于 Win32。您可以在此处获取更多详细信息:http://www.panopticoncentral.net/2013/07/02/introducing-jsrt-embedding-javascript-on-windows/。我不知道这对你的情况是否有帮助。

抱歉,我确定不是您希望的答案...

【讨论】:

  • 感谢您的澄清。这显然是一个很大的失望,但我们会尝试找到解决它的方法。
猜你喜欢
  • 2013-03-21
  • 2011-11-02
  • 2011-07-22
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多