1

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

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

GetScriptDispatch调用返回错误。您可以在 Github 上查看整个示例。

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

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

知道什么给出了吗?我假设这个基本示例应该在 Chakra 中工作。

4

1 回答 1

3

不幸的现实是,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-07-10T22:11:37.480 回答