【问题标题】:How to use jScript 9 features in a VB6 host如何在 VB6 主机中使用 jScript 9 功能
【发布时间】:2013-02-11 12:04:04
【问题描述】:

我想在 VB6 主机上使用 IE9 中的新 JScript 功能(本机 json,...)。 根据我所读到的内容(参见http://blogs.msdn.com/b/jscript/archive/2009/04/17/versioning-language-features-in-jscript.aspx),我必须调用 IActiveScriptProperty::SetProperty 并将 SCRIPTPROP_INVOKEVERSIONING 设置为 2 (SCRIPTLANGUAGEVERSION_5_8)。因此,我已将接口添加到我的 odl 文件中:

...
[
   odl,
   uuid(4954E0D0-FBC7-11D1-8410-006008C3FBFC),
]
interface IActiveScriptProperty : stdole.IUnknown
{
   HRESULT GetProperty(
      [in]  LONG    dwProperty,
      [in]  VARIANT *pvarIndex,
      [out] VARIANT *pvarValue
   );

   HRESULT SetProperty(
      [in] LONG    dwProperty,
      [in] VARIANT *pvarIndex,
      [in] VARIANT *pvarValue
   );
}
...

在 VB6 主机中,我使用以下命令创建引擎:

Dim hRes as Long
Dim IUnk as IUnknown
Dim clsidJS as UUID
Dim uuidActScr as UUID
Dim IProperty as IActiveScriptProperty
Dim IScript As IActiveScript
Dim IParse As IActiveScriptParse

' Create the engine
CLSIDFromString "{16d51579-a30b-4c8b-a276-0ff4dc41e755}", clsidJS    ' JScript9 (Chakra)
CLSIDFromString IID_IActiveScript, uuidActScr
hRes = CoCreateInstance(clsidJS, Nothing, CLSCTX_INPROC_SERVER, uuidActScr, IUnk)

' Set version
Const SCRIPTPROP_INVOKEVERSIONING As Long = &H4000
Dim Version as Variant
Version = 2
Set IProperty = iUnk
IProperty.SetProperty SCRIPTPROP_INVOKEVERSIONING, 0, Version '<--- Here I get error 5 "Invalid procedure call or argument"

在上一篇文章的最后一条评论中,拜伦说: “带有 SCRIPTPTOP_INVOKEVERSIONING 的 SetProperty 的未记录‘特性’是该值必须是 VT_I4 或 VT_I2 - 任何其他整数类型都将被视为无效而被拒绝。”

所以我把上面的代码修改为(VariantType属性来自http://www.xbeat.net/vbspeed/i_OpenODL.htm#VBVM6Lib):

...
Version = 2
VariantType(Version) = VT_I4 ' Force VT_I4 variant type
Set IProperty = iUnk
IProperty.SetProperty SCRIPTPROP_INVOKEVERSIONING, 0, Version '<--- Here I get the same error 5 "Invalid procedure call or argument"

注意:如果我不尝试设置 SCRIPTPROP_INVOKEVERSIONING 属性,引擎工作正常,如果我运行: ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion() + "." + ScriptEngineBuildVersion() 我得到“9.0.16457”,但我无法以原生 json 的形式访问新功能。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: vb6 jscript chakra


    【解决方案1】:

    您必须将声明 ot SetProperty 更改为

    HRESULT SetProperty(
          [in] LONG    dwProperty,
          [in] void    *pvarIndex,
          [in] VARIANT *pvarValue
       );
    

    能够设置无索引属性。只需像在示例代码中那样传递 0 (NULL)。当前声明将SCRIPTPROP_INVOKEVERSIONING 视为一个数组,并且您将第一个索引设置为某个值。

    请注意 VT_I2 = VB6 中的整数和 VT_I4 = Long,因此无需破解这些。只需使用 2 或 2& 或 Private Const SCRIPTLANGUAGEVERSION_5_8 As Long = 2 即可正确输入 const。

    另请注意,在这一行 hRes = CoCreateInstance(clsidJS, Nothing, CLSCTX_INPROC_SERVER, uuidActScr, IUnk) 上,您已经获得了 IActiveScript 接口。以后不需要投Set IProperty = iUnk

    这完全取决于你如何声明CoCreateInstance -- 使用void * 作为最后一个参数将允许你直接传递IProperty 变量并使用clsidJSIActiveScript 接口对其进行初始化。

    【讨论】:

    • 谢谢!我更改了SetProperty 的声明。现在,我没有收到错误,但 JSON 对象仍然是 not defined。有什么想法吗?
    • 你接下来用clsidJS(脉轮)对象做什么?你打算如何在 IE9 中使用这个特定的对象?我认为 IE 必须自己生成脚本引擎。引擎设置可能由加载的 html 页面中的 doctypes 或 metas 控制。抱歉,但你的方法似乎完全错误。
    • 感谢wqw的回复。我不想在 IE9 中使用该对象。我想用VB6 创建一个JScript host。从上面引用的文章:“除了Internet Explorer,还有各种其他主机,例如Windows Script Host,CScript等托管JScript引擎,以避免类似的兼容性问题并使主机能够选择特定的JScript语言功能设置后,JScript 引擎现在公开 IActiveScriptProperty::SCRIPTPROP_INVOKEVERSIONING 属性。"
    • 你确实意识到这个属性是每个实例的,即如果你使用某种定制的主机,你可以在将 JScript 源代码传递给它之前设置你的脚本引擎(所有这些都包含在你的定制中主机环境)。这样,每个主机都可以决定使用什么方式来配置其脚本引擎——元数据、配置文件、注册表。
    • 是的,但是当我想通过调用“IActiveScriptProperty::SCRIPTPROP_INVOKEVERSIONING”属性来设置我的脚本引擎实例(在将 JScript 源代码传递给它之前)时,就会出现问题。谢谢和抱歉。当然,我糟糕的英语使您的回答变得复杂......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2015-02-01
    相关资源
    最近更新 更多