我们在浏览器扩展(BHO)和旧的JScript引擎(CLSID_JScript)中使用活动脚本已经有一段时间了,最近我们决定也支持新的IE9脚本引擎(Chakra)。我们做的一件事是使用带有SCRIPTITEM_CODEONLY
选项的AddNamedItem
向引擎添加符号,以创建我们自己的模块(名称空间)。不幸的是,我们还不能让它与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中工作。
发布于 2013-07-11 06:11:37
不幸的是,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/。我不知道这对你的情况有没有帮助。
抱歉,答案不是你想要的,我敢肯定...
https://stackoverflow.com/questions/17472638
复制相似问题