如何在VB6主机中使用jScript 9功能

时间:2013-02-11 12:04:05

标签: vb6 jscript chakra

我想从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那样访问新功能。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您必须将声明SetProperty更改为

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

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

请注意,VT_I2 = VB6中的整数和VT_I4 = Long,因此无需破解这些。只需使用2或2&amp;或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变量并使用IActiveScript接口初始化clsidJS {{1}}。