在Windows上的Excel VBA中,对于parsing的JSONvariables,这个JScriptTypeInfo是什么?

在这里回答我自己的问题。
我已经在Excel VBA中使用JSON做了一些工作,并且发布了大量的调查结果,我将以问答格式来做这件事https://stackoverflow.com/help/self-answer http://blog.stackoverflow.com/2011 / 07 / ITS-OK-到问一答,你自己的问题/

所以在stackoverflow的其他地方,你可以看到关于在VBA中parsingJSON的问题,但他们似乎错过了一两招。

首先,我使用自定义的JSONparsing库进行了重新设置,而改用ScriptControl的Eval方法作为我所有JSON代码的基础。 而且我们也expression了本地微软解决scheme的偏好。

这里是一个先前的问题在Windows的Excel VBA中,如何缓解由IDE的大小写行为破坏的parsingJSON的点语法遍历问题? 在这个问题上build立。 它显示了如何使用VBA.CallByName比使用点语法来遍历parsing的JSON对象更强大。 另外一个先前的问题在Windows上的Excel VBA中,如何通过parsing的JSON数组循环? 展示了它如何被用来访问数组元素。 但CallByName返回一个奇怪的variablestypes,它出现在监视窗口中作为Object / JScriptTypeInfo,并且如果在直接窗口中有一个types为Debug.Print(或hover在variables上),则获得无形的“[object Object]”。 在系列的另一个问题在Windows上的Excel VBA,如何获得string化的JSON respresentation而不是“[object object]”的parsingJSONvariables? 我提出了一些debugging“糖”,可以很好地检查variables。 在第四个问题在Windows Excel VBA中,如何获取JSON密钥以抢先“运行时错误'438':对象不支持此属性或方法”? ,同时调查如何查询成员的JSON对象,我发现hasOwnProperty()方法似乎附加到JScriptTypeInfo对象。

所以在这个问题中,我问,这究竟是什么JScriptTypeInfo吗?

这是系列5的问题5.这里是全系列

Q1 在Windows上的Excel VBA中,如何缓解IDE大小写行为破坏的parsingJSON的点语法遍历问题?

Q2 在Windows上的Excel VBA中,如何通过parsing的JSON数组循环?

Q3 在Windows上的Excel VBA中,如何获得string化的JSON表示而不是“[object object]”用于parsing的JSONvariables?

Q4 在Windows Excel VBA中,如何获取JSON密钥以预先取得“运行时错误438”:对象不支持此属性或方法“?

Q5 在Windows上的Excel VBA中,对于parsing的JSONvariables,这个JScriptTypeInfo究竟是什么?

一个可能的地方是在ScriptControl的types库中,因为这是发出这种types的库。

在我的机器上这种types的全部细节

 Libary Name: Microsoft Script Control 1.0 (Ver 1.0) LIBID: {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC} Location: C:\wINDOWS\SysWOW64\msscript.ocx 

使用VBA IDE的对象浏览器和反汇编types库的OLEVIEW.exe我不能跟踪JScriptTypeInfo接口或方法hasOwnProperty。

但脚本引擎是否支持语言实现,例如VBScript和JScript(JavaScript的Microsoft名称)。
所以也许我们应该寻找一个JScript实现DLL,并且确实有一个细节

 Libary Name: Microsoft JScript Globals LIBID: {3EEF9759-35FC-11D1-8CE4-00C04FC2B085} Location: C:\wINDOWS\SysWOW64\jscript.dll 

在我的机器上没有注册,所以不在我的Tools-> References库列表或OLEVIEW.exe中。 我很幸运地发现,而周围。
这是OLEVIEW提供的types库的一些输出

 [ uuid(3EEF9758-35FC-11D1-8CE4-00C04FC2B097) ] dispinterface ObjectInstance { properties: methods: [id(0x0000044c)] StringInstance* toString(); [id(0x0000044d)] StringInstance* toLocaleString(); [id(0x0000044e)] VARIANT hasOwnProperty(VARIANT propertyName); [id(0x0000044f)] VARIANT propertyIsEnumerable(VARIANT propertyName); [id(0x00000450)] VARIANT isPrototypeOf(VARIANT obj); [id(0x00000451)] ObjectInstance* valueOf(); }; 

以上显示了hasOwnProperty是使用VBA对象声明的Objecttypes(例如Dim foo as Object )所必需的IDispatch接口(或dispinterface)的一种方法。注册types库与regsvr32似乎什么都不做。 必须浏览到“工具参考”中的文件才能在VBA的对象浏览器中查看。

我们可以相当肯定这个JScript.dll文件,因为使用Process Explorer,我们可以看到执行该行时加载的DLL oScriptEngine.Language = "JScript"在缺less注册types库我将JScript.dll文件加载到Notepad ++并以正则expression式search.JScriptTypeInfo,并发现一个命中。 答对了!

不仅有一个ObjectInstance可以描述VBA程序遇到的大部分variables,而且还有一个令人感兴趣的ArrayInstance,或许我们可以使用Javascript自己的数组函数或至less是JScript.dlltypes库中logging的一个子集。 这里是一些示例代码

 'Tools->References-> 'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx 'and FYI/browsing capabilities Microsoft JScript Globals; C:\wINDOWS\SysWOW64\jscript.dll Option Explicit Private Sub TestJSONParsingWithCallByName5() Dim oScriptEngine As ScriptControl Set oScriptEngine = New ScriptControl oScriptEngine.Language = "JScript" Dim sJsonString(0 To 1) As String sJsonString(0) = "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }" sJsonString(1) = "[ 1234, 2345, 3456, 4567, 5678, 6789 ]" Dim objJSON(0 To 1) As Object Set objJSON(0) = oScriptEngine.Eval("(" + sJsonString(0) + ")") Set objJSON(1) = oScriptEngine.Eval("(" + sJsonString(1) + ")") Debug.Assert objJSON(0).hasOwnProperty("key1") Debug.Assert objJSON(0).hasOwnProperty("key2") Debug.Assert CallByName(objJSON(1), "length", VbGet) = 6 Debug.Assert CallByName(objJSON(1), "0", VbGet) = "1234" '* Is objJSON(1) an ArrayInstance? '* does it support the reverse method of the ArrayInstance object? 'Call objJSON(1).Reverse '* reverse gets capitalised into Reverse ... grrrr Call CallByName(objJSON(1), "reverse", VbMethod) '* so use CallByName as solution to "helpful" capitalisation '* Yes, the elements are reversed! Debug.Assert CallByName(objJSON(1), "length", VbGet) = 6 Debug.Assert CallByName(objJSON(1), "0", VbGet) = "6789" Stop '** And now we know objJSON(1) is an ArrayInstance we can have some fun with array operations Dim objSplice As Object Set objSplice = CallByName(objJSON(1), "splice", VbMethod, 2, 1) Debug.Assert CallByName(objJSON(1), "length", VbGet) = 5 Debug.Assert CallByName(objSplice, "length", VbGet) = 1 Dim objSlice As Object Set objSlice = CallByName(objJSON(1), "slice", VbMethod, 2) Debug.Assert CallByName(objJSON(1), "length", VbGet) = 5 Debug.Assert CallByName(objSlice, "length", VbGet) = 3 Stop Call CallByName(objJSON(1), "sort", VbMethod) Debug.Assert CallByName(objJSON(1), "join", VbMethod) = "1234,2345,3456,5678,6789" Debug.Assert CallByName(objJSON(1), "join", VbMethod, " ") = "1234 2345 3456 5678 6789" Stop Debug.Assert CallByName(objJSON(1), "pop", VbMethod) = "6789" Debug.Assert CallByName(objJSON(1), "length", VbGet) = 4 Stop End Sub 

摘要:JScriptTypeInfo是在VBA IDE监视窗口中显示的内容,以及VBA函数TypeName()的返回值,但它确实隐藏了可以在JScript.dll中find的一些对象。
我认为它可以被描述为多态,也许更好地描述为晚期绑定。 要查看function,请使用Tools-References并浏览至JScript.dll。