返回列表 发帖

[原创] 来看看写脚本时都能调用哪些对象

本帖最后由 wankoilz 于 2013-4-19 22:25 编辑

这是阅读Demon's Blog的文章 "VBS深入CreateObject函数" 后练手写的
运行后得到一个txt,里面罗列了你电脑上脚本可以调用的COM对象,献丑了各位!
'查看写脚本时都能调用哪些COM对象
'From bbs.bathome.net BY wankoilz
'参考 http://demon.tw/copy-paste/vbs-createobject-internal.html
Option Explicit
Dim fso,wshell,reg,f
Dim fullname,colmatch,match,Submatch
Dim i,str,result
Set fso=CreateObject("scripting.filesystemobject")
Set wshell=CreateObject("wscript.shell")
fullname=GetPath(WScript.ScriptFullName)&"ProgrammableObjects.txt"
wshell.Popup "稍等几秒钟...",2,"prompt"
wshell.Run "reg export hkcr\clsid "&""""&fullname&""""&" /y",0,True
Set f=fso.OpenTextFile(fullname,1,True,True)
str=f.ReadAll():f.Close
Set reg=New RegExp
reg.Global=True
reg.IgnoreCase=True
reg.Pattern="ProgID\]\r\n@=(.*?)\r\n\r\n(.*?)Programmable"
Set colmatch=reg.Execute(str)
For Each match In colmatch
    result=result&match.Submatches(0)&vbCrLf&vbCrLf
Next
result=Replace(result,"""","")
fso.CreateTextFile(fullname,True,True).Write(result)
wshell.Run fullname
Function GetPath(fullname)
    Dim arrTmp,i
    arrTmp=Split(fullname,"\")
    For i=0 To UBound(arrTmp)-1
        GetPath=GetPath&arrTmp(i)&"\"
    Next
End FunctionCOPY
参考:http://demon.tw/copy-paste/vbs-createobject-internal.html,Demon's Blog值得一看!!

我是win7,xp没试过。不过我觉得学习到如何查看可调用对象的方法就是了,vbs写出来不复杂的。

TOP

我在winxpsp3测试的,换了台机器
还是报错

QQ 20147578

TOP

感谢Demon兄回复。
这样一来别人看到帖子的时候就不会被误导了。
那么代码中罗列出来的只是部分对象了,但数目已经很多。

TOP

第一,按照UMU的理论,Programmable或者Implemented Categories为{40FC6ED5-2438-11CF-A3DB-080036F12502}的组件都能被VBS调用,你的代码只列出了Programmable的

第二,某些CLSID下的ProgID子键为空,而你的代码没有判断ProgID是否为空,例如下面这样的,你的代码就会匹配到hex(0):
[HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}]
@="GestureRecognizer Class"
[HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\InprocServer32]
@=hex(2):25,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,50,00,72,00,6f,00,67,00,72,\
  00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,4d,00,69,00,63,00,\
  72,00,6f,00,73,00,6f,00,66,00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64,\
  00,5c,00,49,00,6e,00,6b,00,5c,00,49,00,6e,00,6b,00,4f,00,62,00,6a,00,2e,00,\
  64,00,6c,00,6c,00,00,00
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\ProgID]
@=hex(0):
[HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\Programmable]
[HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\TypeLib]
@=hex(0):
[HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\VersionIndependentProgID]
@=hex(0):COPY

TOP

To 3#:
我这里运行没问题...
To 4#:
抱歉,之前没注意那个链接。
我本身实力比较浅,读过那篇文章后闲来为练手才写这么个东东,代码不对的地方还请Demon指点,以免我误认子弟,感谢。

TOP

http://demon.tw/reverse/vbscript-internal-createobject.html

http://demon.tw/programming/createobject-again.html

首先那篇文章不是我写的,是复制粘贴UMU的,文章下面有链接http://hi.baidu.com/umu618/item/8c621e8be433025d840fab07

其次UMU的文章并不完全正确

再次,就算那篇文章正确,你的代码也不正确

TOP

14行报错,文件超出结尾

QQ 20147578

TOP

恭喜楼主神功初成!

TOP

返回列表