批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

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

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

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

恭喜楼主神功初成!

TOP

14行报错,文件超出结尾

QQ 20147578

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

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

TOP

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

第二,某些CLSID下的ProgID子键为空,而你的代码没有判断ProgID是否为空,例如下面这样的,你的代码就会匹配到hex(0):
  1. [HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}]
  2. @="GestureRecognizer Class"
  3. [HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\InprocServer32]
  4. @=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,\
  5.   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,\
  6.   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,\
  7.   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,\
  8.   64,00,6c,00,6c,00,00,00
  9. "ThreadingModel"="Both"
  10. [HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\ProgID]
  11. @=hex(0):
  12. [HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\Programmable]
  13. [HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\TypeLib]
  14. @=hex(0):
  15. [HKEY_CLASSES_ROOT\clsid\{639F5AF5-BCED-4369-AC34-360B16D955FD}\VersionIndependentProgID]
  16. @=hex(0):
复制代码

TOP

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

TOP

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

QQ 20147578

TOP

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

TOP

返回列表