Windows Media Player 7 及更高版本的 class ID 是:clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6.

因特网上的许多地方把 class ID 声明为:clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95. 此 class ID 是一个老的版本,但是依然可以工作,这是因为其向后兼容性。但是如果您使用了老的 class ID,就无法使用增加到组件中的新特性了。Windows Media Player 6.4:clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95;Windows Media Player 6 (更老的版本)clsid:05589FA1-C356-11CE-BF01-00AA0055595A;

 

<object width="390.9" height="559"
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#4,0,0,0">
<param name="SRC" value="main 汉王手写板.swf">
<embed src="main 汉王手写板.swf" width="390.9" height="259"></embed>
</object>

 

 

ActiveX是Microsoft对于一系列面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。

ActiveX控件是Microsoft为抗衡Sun的JAVA技术而提出的,功能和JAVA applet功能类似。

在Windows系统中,有一些以OCX结尾的文件。OCX代表"对象链接与嵌入控件"(OLE),用于处理桌面文件的混合使用。现在COM的概念已经取代OLE的一部分,Microsoft也使用ActiveX控件代表组件对象。

组件的最大优点就是可以被大多数应用程序再使用这些应用程序称为组件容器)。使用ActiveX控件可快速实现小型的组件重用、代码共享,从而提高编程效率,降低开发成本。大家小时候都玩过七巧板和积木,用简单的形状就能构造出我们所能想象出的各种千奇百怪的物体,编程也是这样,组件就好比积木块,我们把组件按不同的方式组合起来,就能实现单个程序达不到的功能。

ActiveX控件运行在客户端。通过它,我们可以获得客户端的一些信息,如IC卡的信息,客户端的验证等,同时,它也可以在我们浏览网页时,得到更多的功能体验,比如观看Flash动画、欣赏电影、歌曲等等。但是ActiveX控件也有许多缺点,最大的缺点是客户端的部署很困难,如客户端不能正确下载,下载了以后不能正确执行,下载的时候需要设置IE的安全级别等等,这也是我行网银使用中客户咨询的热点。另外一个缺点就是由于ActiveX控件可被黑客用来放毒,所以大多数安全类软件都会对其严防死守,这也给我行的控件安装带来了很大的影响。

控件的工作原理

在软件世界,面对不同的国家、不同的厂商以及他们所开发出来的不同的组件、不同的接口,我们怎么来标识呢?我们是用一个GUID结构来标识不同的对象、组件及接口的,GUID是英文globally unique identifier(全球唯一标识符)的首字母缩写,它是微软使用的一个术语,通过特定的算法,它可以给某一个实体创建一个唯一的标识,并且此标识符是全球唯一的。

一个GUID共有128位长(16字节),形如XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。其中每个X是0-9或A-F范围内的一个十六进制的数字。根据定义,GUID在时间和空间上都是唯一的。为保证空间唯一性,每一个GUID需要一个对于生成它的计算机来说是单一的48位值。这个值一般就是机器所装网卡的地址。使用这个值可以保证不同的机器上所生成的GUID值是不相同的。为保证时间上的唯一性,每一个GUID值具有一个60位的时间戳。这个时间戳表示自1852年10月15日00:00:00.00以来以100纳秒为间隔的记数值。根据目前的算法,可保证到公元3400年GUID值仍然是唯一的。

GUID的使用非常广泛,我们平时经常看到,如注册表、类及接口标识、数据库、以及自动生成的机器名、目录名等,你可以打开你的系统盘下的\WINDOWS\Installer目录,可以看到很多类似{0A869A65-8C94-4F7C-A5C7-972D3C8CED9E}的文件夹,这就是系统自动生成的目录名。至于注册表中更是到处都是它的影子。

当我们浏览网页时,控件是如何下载并安装到我们的计算机上的?为了弄清楚这个问题,先来看下面的一段网页代码。

<object id="safeSubmit1"classid="CLSID:8D9E0B29-563C-4226-86C1-5FF2AE77E1D2"codebase="/icbc/newperbank/AxSafeControls.cab#version=1,0,0,6"style="HEIGHT: 0px; WIDTH: 0px" VIEWASTEXT></object>

这段代码是我行个人网银登录页面中的一部分,object元素表示将向网页文件中插入一个对象,classid属性是该对象的类标识,它的值形如"CLSID:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",表明这是一个ActiveX控件。codebase属性是该控件的URL地址,它指向一个cab文件,这个文件是控件开发商打包发行的,里面是控件的执行文件,有.dll文件、.ocx文件、.exe文件等,为了能够自动安装和注册控件,一般还有INF文件来记录相关的一些安装信息。"1,0,0,6"是服务器上该控件的版本号。系统会根据classid先到注册表中去查询,查询该控件的安装及版本信息,查询路径是"HKEY_CLASSES_ROOT\CLSID\{8D9E0B29-563C-4226-86C1-5FF2AE77E1D2}\",如果键值不存在,则控件需要新安装,如果键值存在但版本号小于服务器上的版本号,则会更新控件。

以上面的例子说明,当浏览器解析出object元素时,IE会按照以下流程进行处理:

  1. 通过URL链接下载必要的文件(.cab、.inf或者.exe);
  2. 执行WinVerifyTrust函数对下载文件进行验证,确保文件是安全的;
  3. 完成所有COM组件的自注册,这是调用组件执行文件中的DllRegisterServer函数来完成的;
  4. 向注册表中添加注册信息;
  5. 执行函数CoGetClassObjectFromURL,返回类厂接口指针;
  6. 执行函数CoCreateInstance,创建组件对象实例。

好了,到这里,一个组件实例就生成了。这个过程我写得比较简单,大家如果有兴趣,可以看些软件开发类的书籍,大多数人只要清楚大概的流程就行了。

控件安装前的IE浏览器设置

为了能够顺利下载和安装ActiveX控件,我们需要对IE浏览器做必要的设置,特别是安全级别,安全级太高,很多控件都不可能正常下载,即使下载了也无法安装,安全级太低,又容易引起很多安全问题。那怎样设置才合理呢,我的建议是添加信任站点,将一些银行网站、支付宝等加入信任站点,然后将信任站点的安全级别设为"低",把控件的有关选项全部"启用",而Internet域的安全级别可设置得高一点,这样,我们就既可以有针对性的安装需要的控件,又可以防止一些恶意控件带来的安全问题。具体地设置步骤,大家可以参考

控件的安装

一般来说,只要IE设置正确,那么控件会自动下载并安装,除非你的防火墙和杀毒软件等对它进行了拦截,现在大多数的病毒和木马是在我们浏览网页时下载和传播的,杀毒软件对控件防范还是很严密的,如果总是安装不成功,可能得考虑将杀毒软件和防火墙关闭了。关于浏览网页时安装控件的操作过程。

控件的注册

对于应用软件来说,一般都有一个安装程序,在用户执行安装程序时,ActiveX控件将自动在用户机器上安装并注册。

对于IE来说,在安装控件的时候,它也会自动地进行注册。

对于从网上下载的一些控件,要想使用它们,得手工注册后方可使用,还有一些控件,由于注册信息遭到破坏,无法正常使用时,我们也需要手工注册。这个过程可以通过执行Regsvr32.exe文件来完成。

Regsvr32.exe位于\Windows\System目录(Windows Me/Windows 98/Windows 95)或者\Windows\System32目录(Windows NT/Windows XP/Windows Vista),是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用。它的使用语法如下:

Regsvr32 [/u] [/n] [/i[:cmdline]] dllname/u - 反注册DLL文件。/i - 调用DllInstall时将它传递到可选的[cmdline];在与/u共同使用时,它卸载DLL文件。/n - 不调用DllRegisterServer,它必须与/i连用。/s - 安静模式,即在注册/反注册时不显示结果提示框。(Windows XP和Windows Vista中加入)dllname - 指定要注册的DLL文件名。

输入DLL文件名时,如果是非系统文件,必须使用文件绝对路径,文件路径中不包含中文,否则很可能导致处理失败。如果regsvr32不能正常执行,很可能系统文件遭到破坏,因为使用regsvr32.exe时会调用Kernel32.dll、User32.dll和Ole32.dll三个文件,在DOS模式或其它系统替换正常文件即可解决。

控件的禁用

有时我们根据需要,不希望某些控件运行,这时我们就需要对相关控件进行禁用,禁用控件很简单,可以在IE中设置,也可以直接在注册表中设置。

在IE中禁用控件,打开Internet选项,单击程序选项卡,单击管理加载项,这里列出了IE中加载的所有控件,我们选中需要禁用的控件,选择禁用就行了。

除了在IE中设置外,我们也可以在注册表中进行控件的禁用。打开注册表编辑器,进入路径"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ext\Settings\",下面已经有一些控件了,我们可以试着增加一条,点击Settings,新建一个项,就输入"{73E4740C-08EB-4133-896B-8D0A7C9EE3CD}"吧,在该键值下,我们新建两个值,一个是"Flags",类型是"DWORD",值为"1",一个是"Version",类型是"字符串",值为"*"。好了,大家再登录一下网银试试看。

有时我们一打开某个网页,IE就提示"非法关闭",这很可能是因为该网页加载的控件被破坏,这时,我们可以将已加载的控件逐个禁用,来找到出现问题的控件,然后将之删除或者重新安装,解决IE的故障。

控件的免疫

不知你有没有遇到过这种事,无论你把控件安装程序执行多少遍,控件始终不起作用,网银也用不了,这时很多人都会选择重装系统。其实,这个问题很好解决,原因也很简单,控件可能被杀毒软件给免疫了,我们只需要解除免疫,就可以解决这个问题。控件免疫和控件禁用是不一样的,控件禁用后,我们还可以在IE浏览器中看到这个控件,并且可以启用它,然而控件一旦被免疫,那么IE浏览器就对它完全视而不见,根本不会去理它。

不管控件是被禁用,还是被免疫,现象都是一样的。

那么怎样才能对控件实行免疫呢?方法跟控件禁用差不多,我们还是要先弄清楚目标控件的CLSID,这是一个GUID值,千万不能搞错了,最稳妥的方法当然是咨询控件开发商,可这不太现实,那我们只好自已找了,一般而言,我们可以通过搜索注册表中HKEY_CLASSES_ROOT\CLSID路径下的ProgID键值来确定控件的CLSID。有了这个值就好办了,比如我们要免疫网银输入控件,打开注册表编辑器,进入路径"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility",在该键值下增加一项,输入"{73E4740C-08EB-4133-896B-8D0A7C9EE3CD}",在该项下,我们新建一个DWORD类型的值,名字叫"Compatibility Flags",值为"0x00000400"(十进制为1024)。这样,我们就将网银输入控件给免疫了。免疫后,只要不启用IE中的"对未标记为安全的ActiveX控件初始化并执行脚本"选项,IE就不会调用该控件。

将"Compatibility Flags"的值修改为"0",哈哈,该控件就解除免疫了。为了安全起见,除非你确实没有办法了,可以按照这个方法来分析解决控件安装的问题,对于新手而言,最好还是使用相关工具。

控件的卸载和删除

控件如果不再使用了,我们需要将其从系统中删除,大家可以按照以下流程来完成删除工作。

  1. 单击开始,指向设置,单击控制面板,双击添加或删除程序,然后单击更改或删除程序选项卡。
  2. 如果要删除的ActiveX控件出现在安装的程序列表中,请单击该控件,单击更改/删除,然后按照屏幕上的说明操作。如果ActiveX控件没有出现在安装的程序列表中,则继续执行下一步。
  3. 在资源管理器中,双击"Windows\Downloaded Program Files"文件夹或 "Winnt\Downloaded Program Files"文件夹,右键单击想要删除的ActiveX控件,然后单击删除。
  4. 在系统提示是否删除该控件后,单击是。

如果你要尝试删除的ActiveX控件当前在内存中由IE或"活动桌面"组件加载,会显示"共享冲突"的错误信息,要解决此错误消息,可以按照下列步骤操作:

  1. 关闭所有打开的IE窗口。
  2. 禁用"活动桌面"。
  3. 重新启动Windows。
  4. 按前文介绍的步骤删除ActiveX控件。

 

控件的安全性

ActiveX控件尽管增加了我们上网冲浪时的乐趣,与此同时,它也给我们埋下了巨大的安全隐患,它是一种极其危险的提供功能的方法(目前正在被MS逐渐冷落),因为它是一种组建对象模型(COM)的对象,只要电脑的用户可以完成的任务,它都可以完成。比如它可以存取注册表,可以随意访问本地文件系统等等。一个网页上面的控件一般有2种不安全的状态,一种是脚本的不安全,一种是初始化的不安全。当用户将一个压缩解压缩空间指向一个远程被压缩的包含特洛伊木马的系统文件并且需要控件来解压缩这个文件时,系统安全会被打破。这个状态就是初始化的不安全。从代码的角度来讲,如果控件从IPersist派生,也就是说控件实现了永久性,那么就会触发unsafe for initializing。而在脚本程序安全执行以前,一个控件依赖于特定的系统设置,那么在允许这段代码运行之前控件的开发人员需要提供一些必要的代码。这意味着如果控件从IDispatch派生,也就是说控件支持脚本,那么就会触发unsafe for scripting。

从用户下载一个ActiveX控件开始,这个控件就很容易被攻击,因为网络上任何网络程序都可以使用它,无论是出于友好的目的还是恶意的目的。因此IE浏览器总是试图弹出一个对话框来告诉你,这个控件可能是不安全的。这几乎总是一个很好的预防网络攻击的好方法,但是对于那些我们认为总是安全的控件,我们仍然要接受这种IE产生的干扰,这就使人厌烦了。为了解决这个问题,开发商可以采用软件签名技术。但代码签名证书价格不菲,不是一般人用得了的,同时,即使ActiveX控件具有有效的数字签名,在计算机上安装这些ActiveX控件时也应该谨慎。关于控件的安全性,涉及很多技术问题,这里就不多讨论了,有兴趣的朋友可以参考一下文章《为什么基于ActiveX的安全控件一定是不安全的》。