我们使用旧的JScript引擎(CLSID_JScript)在浏览器扩展(BHO)中使用了活动脚本一段时间,我们最近也决定支持新的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
调用返回错误。您可以看到整个示例on Github。
我在所有IActiveScriptSite
方法上设置了断点,并且唯一被调用的方法是GetLCID
和OnStateChange
,所以不要认为网站实现是问题所在。
我查看了我能找到的每个例子,并尝试了我能想到的一切,包括手动将引擎状态设置为SCRIPTSTATE_CONNECTED
,实现其所需的任何其他接口,等等。我甚至尝试过返回有效LCID
。似乎没什么区别。
知道是什么给出的吗?我假设这个基本的例子应该在Chakra中有用。
答案 0 :(得分: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/。我不知道这是否会对你的情况有所帮助。
对不起,不是你希望的答案,我敢肯定......