现在的位置: 首页 > 综合 > 正文

第一章 什么是ActiveX控件?

2014年02月12日 ⁄ 综合 ⁄ 共 3175字 ⁄ 字号 评论关闭

什么是ActiveX控件?

ActiveX控件是提供了许多能够被其他应用如IE和其他如由Visual Basic和Visual C++开发工具创建的应用程序重用的一些泛函数的可编程基础.ActiveX控件是存储在动态链接库(DLL)文件和拥有.ocx或.dll后缀文件中的COM对象.

NOTE

When the client application needs to use the ActiveX control, DLL files are loaded into the client application's address space. Because the DLL file is loaded into the same process as the client's, ActiveX controls are typically referred to as In Process (InProc for short) COM objects.

Activex控件和将在第2章讨论的固有控件很相似:他们代表性的提供了一个图形接口,比如按扭或文本框,通过他们,用户可以让这些控件相互作用.和固有控件相似的,ActiveX可以拥有方法,属性和集合,它们能触发事件.然而,考虑到控件,一个对象不需要有图形用户接口或公共的方法,属性,事件和集合.如果一个控件没有这些特点中的一个-----比如,没有用户接口,方法-----这个控件相当糟糕,根本没用.因此本章的每一个控件例子包含了一个用户接口和许多方法,属性和事件.

没有用户接口,但是至少有一个公共方法,属性,事件或集合(有时候都有)的对象被认为是COM对象.尽管没有用户接口,COM对象仍然很有用.COM对象总是被创建成提供许多不需要用户接口或是用户接口与它无关的公共方法-----比如,你不需要在网页中拥有从数据库读取数据和插入数据的系统.ActiveX控件能够被客户端重用,同样的COM对象能够被客户端应用程序重用.在本章,我们将集中创建ActiveX控件,但是任将介绍简单的COM对象(不相似)来创建ActiveX控件.

插入ActiveX控件到web页面中

在学习怎样创建ActiveX控件之前,你需要知道怎样在web页面上插入将被装载进IE的控件.我们将在本章中使用IE来测试我们创建的所有控件.在web页面中插入ActiveX控件是很简单的.你只需使用HTML<object>标签.这个标签就象<H1>,<p>或其他任何我们将在第2章讲述的HTML标签一样.因为在DHTML对象模型中,所有的HTML元素都被设计成一个对象,你可以象写其他HTML元素一样写出<OBJECT>标签.在本章稍后的"给Visual Basic控件编写脚本"和"给ATL控件编写脚本"节中,你将知道怎样为ActiveX控件编写脚本.

<OBJECT>标签拥有和其他任何HTML标签一样的属性.CLASSID是所有属性中最重要的.它告诉IE装载哪一个控件到页面中.CLASSID属性指向了ActiveX控件的class Id(缩写CLSID).CLSID是标识ActiveX控件或许多其他COM对象类型的128位全局唯一标识符(GUID).

GUID保证时间,空间跨越的唯一性.比如,如果某人在南极洲(可能出现)创建了一个CLSID,在同一个准确时间,你在美国也创建了一个,CLSID将会不同.(如果某人在某处老家创建一个GUID,GUID将照样唯一!)用来创建GUID或CLDID的算法是很复杂的,所以本书将不会介绍.相信我-----它没问题.

你可能想知道为什么不能只给ActiveX控件取一个有关系的名字,象"Bob"来代替GUID,这样将很难阅读.想象比如你给你的ActiveX控件取名为"Bob",有人在津巴布韦取了相同的名字.如果用户在她机器上安装了你的控件,然后安装津巴布韦的控件,客户端应用程序想用"Bob"控件,将总是使用的津巴布韦的控件.为什么?安装来自津巴布韦的"Bob"控件将使你的控件不可用,因为都用了相同的名字.

在很多项目中,这种情况将会导致版本问题,因为客户端应用程序可能已经被创建成访问在你的控件的存在的方法和属性但是在来自津巴布韦的控件不存在.如果你使用GUID来标识你的控件,客户端应用通过控件的CLSID来引用将保证能够访问到你的控件而不是来自津巴布韦的控件.

CLSID被存储在以下的注册表键中:

HKEY_CLASSES_ROOT/CLSID

在注册表的这个键下可能有成百上千的CLSID来标识你系统中的ActiveX控件和其他的COM对象.图5-1显示了注册表中的Calendar控件的CLSID:

{8E27C92B-1264-101C-8A2F-040224009C02}
如果你仔细查看注册表编辑器的右框,你会找到这个键值.这个键值里面列出了与"Calendar Control 8.0"相关
的名字.所有的CLSID都有相同的格式:他们都是一个128位的数字标识.
Click to view at full size.
图5-1 注册表中日历控件的CLSID.
现在关于CLSID你已经知道一点了,我们再来看看CLASSID的属性.CLASSID属性告诉IE你想装入页面的ActiveX
控件的CLSID,当给<Object>标签指定CLASSID时,你必须首先在CLSID值加一个"clsid"前缀,不要包含你在注
册表中直接看到的CLSID.例如,要把日历控件嵌入页面,你要把下面的HTML代码加入到页面中.代码运行结果如图5-2.
<OBJECT CLASSID="clsid:8E27C92B-1264-101C-8A2F-040224009C02"></OBJECT>
IE查找到<Object>标签以后立即查找CLASSID属性.然后IE读取CLASSID属性的值,即你想插入到页面的ActiveX控
件的CLSID,然后在注册表中查找该CLSID.如果IE在注册表中查找到CLSID,它就读取名为InprocServer32的
子键,它是指定页面显示IE应该载入到页面的名为DLL(.ocx或.dll文件)的名称和路径.图5-3显示了日历控件的
InprocServer32键.
Click to view at full size.
图5-2 日历控件插入到页面
当你看到图5-3注册表编辑器右框内InprocServer32键,你看到两个值,第一个值是默认值,它指定为ActiveX控件
 
载入DLL的路径和名称.对于日历主件,(Default)值指定了文件mscal.ocx的路径C:/WinNT/System32.第二个值
 
是ThreadingModel.
 

NOTE

I won't cover the advanced COM topic of threading models in this book. Just note that the threading model we're talking about is the Apartment model. Only controls that support at least the Apartment-threading model can safely be used on a Web page in Internet Explorer. I'll show you how to mark controls as Apartment threaded when we create ActiveX controls.

 
Click to view at full size.
 
图5-3 日历主件的InprocServer32值
 
除了CLASSID,你可能想为<OBJECT>标签指定一些其他重要的属性.要为ActiveX控件编写脚本,你需要包含ID属性和
给它指定任意的名称,就象你想为其他HTML标签写脚本一样.有时候为<OBJECT>标签指定HEIGHT和WIDTH属性也很重
要.如果不这样,控件可能不会正常显示因为IE不是自动调整.我们将在"创建Visual Basic ActiveX控件"这章研究.
 

抱歉!评论已关闭.