我们有一个基于 Web 浏览器构建的解决方案,该解决方案将使用 JS 引擎。升级到Windows 11 22H2后,我们发现解决方案的行为与以前不同。我们做了一些研究,然后发现Windows 11 22H2使用JS引擎的方式与之前的版本不同:
在 Windows 11 22H2 之前,当 WebBrowser 调用 JS 引擎时,会加载 jscript9.dll 和 jscript.dll 进行作业;
在Windows 11 22H2中,当WebBrowser调用JS引擎时,会加载jscript9.dll和jscriptlegacy.dll。
由于这种差异,我们的解决方案实际上已停止工作。 (我们尝试了一些解决方案,但结果都不好)。
我们相信您几乎没有机会改变 Windows 11 22H2 当前的行为。
基于COM,使用Webbrowser控件加载JavaScript。应用程序中有许多 JavaScript 对象。每个 JavaScript 对象都与一个 C++ 对象关联。 C++对象存储了JavaScript对象的IDispath指针,这样C++对象就可以直接调用JavaScript对象。 在 22H2 之前,IDispatch 指向的 JavaScript 对象在 JavaScript 对象的生命周期内保持有效。 然而在 22H2 中,JavaScript 对象变成了临时对象,并在作为参数传递给 C++ 对象后被 JavaScript 引擎销毁。然后如果C++对象想要调用JavaScript对象,调用就会失败,因为它找不到JavaScript对象。 然后我们跟踪调用,发现WebBrowser调用JavaScript引擎时加载的文件存在差异。
您能否建议我们如何更改我们的解决方案,以便在 Windows 11 22H2 中仍使用旧方式(当 WebBrowser 调用 JS 引擎时,它会加载 jscript9.dll 和 jscript.dll)?
您可以使用策略来控制与 JScript 与 JScript9legacy 相关的行为。当然,由于这是一项进入注册表项的策略,因此您也可以直接更改注册表项。
https://admx.help/?Category=Windows_11_2022&Policy=Microsoft.Policies.InternetExplorer::JScriptReplacement