上面的脚本显示在我的系统中存在1000多个对象可以调用。哇!VBS居然可以调用那么多对象!别高兴得太早,我前面说了“假设上面的说法正确”。实际上,UMU的说法并不完全正确,Programmable或者Implemented Categories为{40FC6ED5-2438-11CF-A3DB-080036F12502}的对象也不一定能够用CreateObject创建,比如我系统中有一个ComCtl3.Band就属于这种情况;另外,某些对象并没有Programmable或者Implemented Categories,但是照样可以用CreateObject创建,比如说WindowsInstaller.Installer。
所以不能单纯依靠注册表的是非存在Programmable或者Implemented Categories来判断,那么如果来判断呢?一种方法是根据《VBS技术内幕:CreateObject函数》里面说的,写一个C++程序来模拟CreateObject函数,判断对象是否支持IDispatch接口。不过这样太麻烦了,比较简单的方法是让CreateObject函数自己来判断:
| Option Explicit Const HKEY_CLASSES_ROOT = &H80000000 Dim arrProgID, strProgID, strCLSID Dim objReg, objFso, objFile, objShell, O Set objReg = GetObject("winmgmts:.rootdefault:StdRegProv") Set objFso = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") Set objFile = objFso.OpenTextFile("ProgID.txt", 2, True) 'By Demon 'http://demon.tw objReg.EnumKey HKEY_CLASSES_ROOT, "", arrProgID For Each strProgID In arrProgID If GetCLSID(strProgID, strCLSID) Then If IsCreatable(strProgID) Then objFile.WriteLine strProgID End If End If Next objShell.Run "ProgID.txt" Function IsCreatable(strProgID) On Error Resume Next Dim O Set O = CreateObject(strProgID) If Err.Number = 0 Then IsCreatable = True Else IsCreatable = False End If Set O = Nothing Err.Clear End Function Function RegKeyExists(hKey, strSubKey) Dim a, n n = objReg.EnumKey(hKey, strSubKey, a) If n = 0 Then RegKeyExists = True Else RegKeyExists = False End If End Function Function GetCLSID(strProgID, strCLSID) Dim s GetCLSID = False If RegKeyExists(HKEY_CLASSES_ROOT, strProgID & "CLSID") Then objReg.GetStringValue HKEY_CLASSES_ROOT, strProgID & "CLSID", "", s If Not IsNull(s) Then strCLSID = s GetCLSID = True End If End If End Function |
说了这么多,其实我真正想说的是,就算你用上面的脚本得到了“VBS对象大全”又有什么意义呢?我敢肯定的告诉你,这些对象里面有95%以上你从来都见过,也不知道它们是做什么的,更不用说去调用。
我常用的VBS对象只有下面几个:
ADODB.Stream
InternetExplorer.Application
Msxml2.XMLHTTP
Scripting.Dictionary
Scripting.FileSystemObject
Shell.Application
WScript.Shell
把这些对象都弄懂了,VBS基本上就入门了。
以上部分内容来自:http://demon.tw/programming/createobject-again.html







