在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?

在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?,第1张

在Windows上的Excel VBA中,对于已解析的JSON变量,此JScriptTypeInfo到底是什么?

一个可能的地方是scriptControl的类型库,因为这是散发此类型的库。

我的机器上此类型的完整详细信息是

Libary Name:    Microsoft script Control 1.0 (Ver 1.0)       LIBID:          {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}Location:       C:wINDOWSSysWOW64msscript.ocx

同时使用VBA IDE的对象浏览器和反汇编类型库的OLEVIEW.exe,我无法跟踪接口JscriptTypeInfo或方法hasOwnProperty。

但是脚本引擎托管的语言实现不是这种情况,例如VBscript和Jscript(Java脚本的Microsoft名称)。
所以也许我们应该寻找一个Jscript实现DLL,的确有一个细节。

Libary Name:    Microsoft Jscript GlobalsLIBID:          {3EEF9759-35FC-11D1-8CE4-00C04FC2B085}Location:       C:wINDOWSSysWOW64jscript.dll

我机器上的哪个未注册,因此不在我的“工具”->“参考”库列表或OLEVIEW.exe中。我很幸运能在闲逛时找到。
这是OLEVIEW的一些输出,提供了类型库的摘录

[  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是IDispatch接口(或dispinterface)的一种方法,该方法是处理VBA对象声明为Object类型的(例如

Dimfoo as Object
)必需的。使用regsvr32注册类型库似乎无济于事。必须在“工具参考”中浏览该文件才能在VBA的对象浏览器中查看。

我们可以很确定地知道这个Jscript.dll文件,因为使用Process Explorer我们可以看到执行该行时正在加载dll

oscriptEngine.Language = "Jscript"
。在缺少注册类型库的情况下,我将文件Jscript.dll加载到了Notepad
++中,并搜索了.JscriptTypeInfo作为正则表达式,发现一击。答对了!

不仅有一个ObjectInstance描述了VBA程序遇到的大多数变量,而且还有一个引人入胜的ArrayInstance,也许我们可以使用Javascript自己的数组函数,或者至少使用Jscript.dll类型库中记录的子集。这是一些示例代码

'Tools->References->'Microsoft script Control 1.0;  {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:WindowsSysWOW64msscript.ocx'and FYI/browsing capabilities       Microsoft Jscript Globals;   C:wINDOWSSysWOW64jscript.dllOption ExplicitPrivate 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    StopEnd Sub

简介:JscriptTypeInfo是要在VBAIDE监视窗口中显示的内容以及VBA函数TypeName()的返回,但是它实际上隐藏了可以在Jscript.dll中找到的许多对象。我想可以将其描述为多态的,也许最好将其描述为后期绑定。要查看功能,请使用“工具参考”并浏览到Jscript.dll。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4945396.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存