首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在jScript主机中使用VB6 9特性

如何在jScript主机中使用VB6 9特性
EN

Stack Overflow用户
提问于 2013-02-11 12:04:04
回答 1查看 1K关注 0票数 2

我想在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文件中:

代码语言:javascript
运行
复制
...
[
   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主机中,我创建引擎时:

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
...
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访问新特性。

有什么想法吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-02-12 08:06:57

必须将SetProperty的声明更改为

代码语言:javascript
运行
复制
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变量,并通过clsidJSIActiveScript接口对其进行初始化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14811458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档