我想在JScript中使用新的IE9特性(本机json,.)来自VB6主机。根据我所读到的内容(参见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"在上一篇文章的最后评论中,拜伦说:“SetProperty和SCRIPTPTOP_INVOKEVERSIONING的无文档的‘特性’是值必须是VT_I4或VT_I2 -任何其他整数类型都将被拒绝为无效。”。
因此,我将上述代码修改为(VariantType属性来自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访问新特性。
有什么想法吗?
谢谢!
发布于 2013-02-12 08:06:57
必须将SetProperty的声明更改为
HRESULT SetProperty(
[in] LONG dwProperty,
[in] void *pvarIndex,
[in] VARIANT *pvarValue
);能够设置无索引属性。只需像在示例代码中那样传递0 (NULL)即可。现在的声明将SCRIPTPROP_INVOKEVERSIONING看作一个数组,并且您将第一个索引设置为某个值。
请注意,VT_I2 = Integer in 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 *作为最后一个param将允许您直接传递IProperty变量,并通过clsidJS的IActiveScript接口对其进行初始化。
https://stackoverflow.com/questions/14811458
复制相似问题