百度空间 | 百度首页 
 
查看文章
 
[UMU WSH 教程](9)CreateObject 过程
2007年04月09日 星期一 15:46

[UMU WSH 教程](5)脚本超时

[UMU WSH 教程](6)命令行参数

[UMU WSH 教程](7)WScript 对象

[UMU WSH 教程](8)脚本中的脚本


  本篇要讲的是对象的创建,属于 COM 的内容,这里不可能说太多,大家可以找一些 COM 的书看看,也可以看看 UMU 的其他关于 COM 的文章:《ATL 体验》、《基于 WebBrowser 的新型应用程序研究小记》、《学习 ATL 的理由》、《关于 COM 的几个概念问题》、《关于 COM 的几个概念问题(2)》。最常见的对象有:WScript.Shell、Scripting.FileSystemObject、Scripting.Dictionary 等,这里以 WScript.Shell 为例。

  马上来看对象的创建过程,语句 Set objWSH = CreateObject( "WScript.Shell" ):

  1、CreateObject 函数先检查注册表 HKEY_CLASSES_ROOT\WScript.Shell 下的子键 CurVer 的默认值,结果为 WScript.Shell.1,所以知道最新版本是 WScript.Shell.1;


  2、读 HKEY_CLASSES_ROOT\WScript.Shell.1,下面有一个子键 CLSID,默认值为 {72C24DD5-D70A-438B-8A42-98424B88AFB8};


  3、找到了 HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8},子键 InProcServer32 的默认值说明服务程序是 C:\WINDOWS\system32\wshom.ocx。


  4、对于脚本可以调用的 COM 对象,要使用对象里的方法 TypeLib 是必要的,HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\TypeLib 的默认值是 {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B},HKEY_CLASSES_ROOT\TypeLib\{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}\1.0\0\win32 的默认值说明类型库是 C:\WINDOWS\system32\wshom.ocx。

  支持脚本调用的 COM 对象必然要实现 IDispatch 接口,可以从 C:\WINDOWS\system32\wshom.ocx 的“资源 - TYPELIB”里看出来,每个对象开头的 7 个函数都是 QueryInterface、AddRef、Release、GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、Invoke,前 3 个是 IUnknown 接口的函数。PE 文件里的 TYPELIB 资源是 *.idl 源码文件编译后的类型库的二进制数据,可以反编译回去。不过 UMU 推荐使用 eXeScope 查看,即使用 eXeScope 打开 C:\WINDOWS\system32\wshom.ocx,查看“资源 - TYPELIB”,可以看出每个接口函数的参数和返回值定义。

  VB 开发环境就是这样知道对象里有什么函数的。所以,如果我们知道一个对象名,却不知道这个对象里有什么函数,可以用上面说的方法获得。

  xuejinglan 于 2007年03月31日 星期六 11:40 问 UMU 这样一个问题:“系统中存在哪些对象,对象有那些函数可以调用,如何知道?”这个问题已经回答后一半了,下面回答前一半。

  对象的注册信息 HKEY_CLASSES_ROOT\CLSID\{GUID} 下可能会有这样的一些子键:Control 说明该组件是一个 ActiveX 控件、Programmable 说明该组件支持自动化、Insertable 说明该组件可以被嵌入到一个 OLE 文档容器中。能找到 Programmable,说明支持自动化,也就是支持 IDispatch 接口,所以它可以被脚本语言使用。不过这种方式比较老了,现在已经被一个的组件类属代替,即 Implemented Categories 子键下面的 GUID 形式的子键。比如 HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502},看一下 HKEY_CLASSES_ROOT\Component Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502} 下的 409 字符串值为 Automation Objects,也就是“自动化对象”。

  查找“自动化对象”可以使用 VS 带的工具 oleview.exe,它专门用来查看 OLE/COM 对象的注册信息,界面如下图:

  人民群众可能有点头晕了,总结一下:组件类属为 {40FC6ED5-2438-11CF-A3DB-080036F12502}(Automation Objects) 的对象都支持被脚本调用。

  接下去的创建过程不属于脚本应该考虑的范围,有兴趣学 COM 的话可以研究研究,很好的一个机制,值得学习。

  OLE/COM Object Viewer 6.0 下载:http://umu.ys168.com/,Tools - VS - OleView.7z (96KB)


类别:wsh 专栏 | 添加到搜藏 | 浏览() | 评论 (12)
 
最近读者:
 
网友评论:
1
2007年04月09日 星期一 16:34 | 回复
人品不好 看不懂
 
2
2007年04月09日 星期一 16:46 | 回复
太精彩老 期待你的下一篇教材呀!!
 
3
2007年04月15日 星期日 18:03 | 回复
我的人品也不好 也看不懂!
 
4
2007年07月11日 星期三 02:01 | 回复
什么时间这成了人品问题了呀,你这样说那不是说我人品也不好了?以后不许这样说了哦```````````````````````
 
5
2007年11月18日 星期日 10:04 | 回复
Automation Objects的对象都支持被脚本调用。 但是有些脚本就未必能用吧 我按照你的说法就发现有些没有progid
 
7
2007年11月18日 星期日 16:04 | 回复
如果WSC可以的话,那么wmplayer.ocx组件为啥不能使用WSC注册呢? 也就是说写成WSC文件,然后不注册直接调用WSC文件,这样不就完成不注册wmplayer.ocx组件而能使用其了么?
 
8
2007年11月18日 星期日 18:01 | 回复
ocx 本质是 DLL,WSC 是脚本,速度差很多,播放器是需要速度的,并且 DLL 可以保护代码,WSC 不行。
 
9
2007年11月22日 星期四 10:04 | 回复
谢谢!
 
10
2008年05月27日 星期二 20:04 | 回复
不太明白呀!
 
12
2008年07月15日 星期二 22:43 | 回复
这个……一开就会看了,不需要看什么书啊,或者说你找 COM 的资料看看就行
 
13
2008年07月16日 星期三 00:45 | 回复
哦,知道了,呵呵 谢谢UMU大哥啦。
 
14
2008年09月21日 星期日 11:01 | 回复
顶!精彩!姗姗来迟了~~~
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu