vbs能调用的系统对象小结
vbs能调用系统对象:
文件系统对象相关:("scripting.filesystemobject")
字典相关:("scripting.dictionary")
脚本外壳相关:("wscript.shell")
windows外壳相关:("shell.application")
正则表达式相关:("vbscript.regexp")
asp相关:("mswc.adrotator")("mswc.nextlink")("mswc.myinfo")
公用对话框相关:("mscomdlg.commondialog")?
编码与密码相关:("scriptpw.password")?(?"scripting.encoder"?)
邮件发送的组件相关:("jmail.message")("cdonts.newmail")("cdo.configuration")("eudora.euapplication.1")("novellgroupwaresession")
水晶报表相关:?("crystalruntime.application")?
ie浏览器相关:?("internetexplorer.application")?
windows媒体播放相关:?("wmplayer.ocx")("wmplayer.ocx.7"?)
助手角色相关:("agent.control")
ado相关:("adodb.connection")("adodb.command")("adodb.recordset")("adodb.record")("adodb.stream")("dao.dbengine.35")("adox.catalog")("adox.table")
sql相关:("sqldmo.sqlserver")("sqldmo.login")("sqldmo.backup")("sqldmo.user")("sqldmo.backupdevice")("sqldmo.database")("sqldmo.restore")("sqldmo.application")office相关:("word.application")("excel.application")("powerpoint.application")("excel.sheet")("frontpage.application")("access.application")("msgraph.application")("outlook.application")
图像图形相关:("aspimage.jpeg")("persits.jpeg")("activeimage.images.1")?("jsdraw.ops")("jsiptc.jpgedit")("gflax.gflax")("photoshop.application")
语音朗读相关:("speech.voicetext")("speech.voicetext.1")("sapi.spvoice")("sapi.spfilestream")("texttospeech.texttospeech")("texttospeech.texttospeech.1")("activevoice.activevoice")("activevoice.activevoice.1")
操作系统相关:("jsdlgbox.browser")("jsbin.binaryops")("jsform.window")("jslistvw.list")("jssys3.ops")("jssys3.iniedit")?("tli.tliapplication")("autoitx3.control")("windowsinstaller.installer")("virtualserver.application")("useraccounts.commondialog")("mosearch.gatherlog.1")("mscomdlg.commondialog")
wmi相关:("wbemscripting.swbemdatetime")("wbemscripting.swbemlocator")("wbemscripting.swbemnamedvalueset")("wbemscripting.swbemsink",?"sink_")?("wbemscripting.swbemrefresher")("wbemscripting.swbemlasterror")("wbemscripting.swbemobjectpath")
web,net相关:("winhttp.winhttprequest")("winhttp.winhttprequest.5.1")("msxml2.serverxmlhttp")("microsoft.xmlhttp")("microsoft.xmldom")("msxml2.xmlhttp.4.0")("wscript.network")("asphttp.conn")("inetctls.inet")("post.clspost")("webget.web")("netcommocx.netcomm",?"com_")?("mswinsock.winsock")("rcbdyctl.setting")==================================其他罕见的类型库,如果你用得着,也可以列入常用库:
消息队列:("msmq.msmqmessage")("msmq.msmqqueueinfo")("msmq.msmqquery")
索引服务:("ixsso.query")("ixsso.util")
信使服务:("messenger.msgrobject")("messenger.messengerapp")("msnmessenger.messengerapp")
打印和传真:("winprint.winprintx")("winfax.sdksend")?(faxserver.faxserver)("fmfaxapi.application")("oleprn.dsprintqueue.1")
数据库会话:("accpac.xapisession")
报表与pdf发布:("impromptu.application.30")
条形码与标签:("bartender.application")
邮件群发:("notes.notessession")("notes.notesuiworkspace")("notes.notesuiworkspace")
网络会议:("netmeeting.app.1")
ms编程:("msproject.application")("sourcesafe.0")
路由与映射:("mappoint.application")
矢量绘图:("visio.application")
建模:("rose.application")
再谈CreateObject函数,VBS到底能调用哪些对象?
VBS的CreateObject函数到底能够创建哪些对象,几乎是每个VBS新手都困惑的问题,他们总是热衷于寻找“VBS对象大全”。
对象的注册信息HKEY_CLASSES_ROOT\CLSID\{GUID}下可能会有这样的一些子键:Control说明该组件是一个ActiveX控件、Programmable说明该组件支持自动化、Insertable说明该组件可以被嵌入到一个OLE文档容器中。能找到Programmable,说明支持自动化,也就是支持IDispatch接口,所以它可以被脚本语言使用。不过这种方式比较老了,现在已经被一个的组件类属代替,即ImplementedCategories子键下面的GUID形式的子键。比如HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\ImplementedCategories\{40FC6ED5-2438-11CF-A3DB-080036F12502},看一下HKEY_CLASSES_ROOT\ComponentCategories\{40FC6ED5-2438-11CF-A3DB-080036F12502}下的409字符串值为AutomationObjects,也就是“自动化对象”。
也就是说,如果注册表中一个对象的ProgID对应的CLSID下包含有子键Programmable或者ImplementedCategories\{40FC6ED5-2438-11CF-A3DB-080036F12502},那么这个对象就能用CreateObject函数创建。
假设上面的说法正确,那么我们可以用下面的脚本获取“VBS对象大全”:
OptionExplicit ConstHKEY_CLASSES_ROOT=&H80000000 DimarrProgID,strProgID,strCLSID DimobjReg,objFso,objFile,objShell SetobjReg=GetObject("winmgmts:\\.\root\default:StdRegProv") SetobjFso=CreateObject("Scripting.FileSystemObject") SetobjShell=CreateObject("WScript.Shell") SetobjFile=objFso.OpenTextFile("ProgID.txt",2,True) 'ByDemon 'http://demon.tw objReg.EnumKeyHKEY_CLASSES_ROOT,"",arrProgID ForEachstrProgIDInarrProgID IfGetCLSID(strProgID,strCLSID)Then IfIsProgrammable(strCLSID)OrIsAutomationObject(strCLSID)Then objFile.WriteLinestrProgID EndIf EndIf Next objShell.Run"ProgID.txt" FunctionRegKeyExists(hKey,strSubKey) Dima,n n=objReg.EnumKey(hKey,strSubKey,a) Ifn=0Then RegKeyExists=True Else RegKeyExists=False EndIf EndFunction FunctionIsAutomationObject(strCLSID) DimstrSubKey IsAutomationObject=False strSubKey="CLSID\"&strCLSID&"\ImplementedCategories" IfRegKeyExists(HKEY_CLASSES_ROOT,strSubKey)Then strSubKey=strSubKey&"{40FC6ED5-2438-11CF-A3DB-080036F12502}" IfRegKeyExists(HKEY_CLASSES_ROOT,strSubKey)Then IsAutomationObject=True EndIf EndIf EndFunction FunctionIsProgrammable(strCLSID) IsProgrammable=RegKeyExists(HKEY_CLASSES_ROOT,_ "CLSID\"&strCLSID&"\Programmable") EndFunction FunctionGetCLSID(strProgID,strCLSID) Dims GetCLSID=False IfRegKeyExists(HKEY_CLASSES_ROOT,strProgID&"\CLSID")Then objReg.GetStringValueHKEY_CLASSES_ROOT,strProgID&"\CLSID","",s IfNotIsNull(s)Then strCLSID=s GetCLSID=True EndIf EndIf EndFunction
上面的脚本显示在我的系统中存在1000多个对象可以调用。哇!VBS居然可以调用那么多对象!别高兴得太早,我前面说了“假设上面的说法正确”。实际上,UMU的说法并不完全正确,Programmable或者ImplementedCategories为{40FC6ED5-2438-11CF-A3DB-080036F12502}的对象也不一定能够用CreateObject创建,比如我系统中有一个ComCtl3.Band就属于这种情况;另外,某些对象并没有Programmable或者ImplementedCategories,但是照样可以用CreateObject创建,比如说WindowsInstaller.Installer。
所以不能单纯依靠注册表的是非存在Programmable或者ImplementedCategories来判断,那么如果来判断呢?一种方法是根据《VBS技术内幕:CreateObject函数》里面说的,写一个C++程序来模拟CreateObject函数,判断对象是否支持IDispatch接口。不过这样太麻烦了,比较简单的方法是让CreateObject函数自己来判断:
OptionExplicit ConstHKEY_CLASSES_ROOT=&H80000000 DimarrProgID,strProgID,strCLSID DimobjReg,objFso,objFile,objShell,O SetobjReg=GetObject("winmgmts:\\.\root\default:StdRegProv") SetobjFso=CreateObject("Scripting.FileSystemObject") SetobjShell=CreateObject("WScript.Shell") SetobjFile=objFso.OpenTextFile("ProgID.txt",2,True) 'ByDemon 'http://demon.tw objReg.EnumKeyHKEY_CLASSES_ROOT,"",arrProgID ForEachstrProgIDInarrProgID IfGetCLSID(strProgID,strCLSID)Then IfIsCreatable(strProgID)Then objFile.WriteLinestrProgID EndIf EndIf Next objShell.Run"ProgID.txt" FunctionIsCreatable(strProgID) OnErrorResumeNext DimO SetO=CreateObject(strProgID) IfErr.Number=0Then IsCreatable=True Else IsCreatable=False EndIf SetO=Nothing Err.Clear EndFunction FunctionRegKeyExists(hKey,strSubKey) Dima,n n=objReg.EnumKey(hKey,strSubKey,a) Ifn=0Then RegKeyExists=True Else RegKeyExists=False EndIf EndFunction FunctionGetCLSID(strProgID,strCLSID) Dims GetCLSID=False IfRegKeyExists(HKEY_CLASSES_ROOT,strProgID&"\CLSID")Then objReg.GetStringValueHKEY_CLASSES_ROOT,strProgID&"\CLSID","",s IfNotIsNull(s)Then strCLSID=s GetCLSID=True EndIf EndIf EndFunction
说了这么多,其实我真正想说的是,就算你用上面的脚本得到了“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