ActiveX 控件是微软开发的一种基于组件对象模型(Component Object Model, COM)的技术,它允许开发者创建可重用的软件组件,这些组件可以在不同的应用程序中使用。ActiveX 控件是自包含的,拥有自己的状态,并且通过 COM 接口与容器(如网页浏览器)进行通信。这种技术在20世纪90年代初期流行,特别是在Internet Explorer中,用于增强网页的交互性和功能。
在Internet环境下,ActiveX控件能够自动下载和安装,这得益于它们的可独立发布特性。当用户访问包含ActiveX控件的网页时,如果客户端系统中尚未安装该控件,浏览器会根据HTML页面中的指示自动下载并注册。然而,这也带来了一些安全问题,因为未经许可的控件可能会引入恶意软件,因此,IE会在创建控件对象时进行许可证检查,以确保系统的安全性。
为了实现与Internet Explorer的交互,ActiveX控件通常需要实现一系列接口,例如:
1. **IOleObject**:这个接口允许控件与容器的站点对象进行通信,管理控件的生命周期和视觉特性。
2. **IOleInPlaceObject**:支持控件的实地激活特性,即控件可以直接在文档内进行操作。
3. **IOleInPlaceActiveObject**:进一步扩展了IOleInPlaceObject,允许控件在实地激活状态下与宿主环境交互。
4. **IOleControl**:提供了快捷键支持、环境属性访问和事件处理等功能。
5. **IDataObject**:用于数据对象的特性,比如剪贴板操作和拖放操作。
6. **IViewObject2**:使控件在非实地激活状态下也能显示信息。
7. **IDispatch**:用于实现自定义属性和方法的自动化访问,使得控件能被脚本语言控制。
8. **IConnectionPointContainer**:支持连接点,允许控件向其他对象暴露事件。
9. **IProvideClassInfo[2]**:提供对象类型信息,便于自动化和编程。
10. **ISpecifyPropertyPages**:支持属性页,使得用户可以通过图形界面配置控件的属性。
11. **IPersistStream[Init]** 或 **IPersistStorage**:实现永久存储,保证控件的状态在不同会话间得以保存。
为了减小程序代码的大小,Microsoft Visual C++提供了ATL(Active Template Library)模板库,它为创建轻量级的ActiveX控件提供了便利。同时,控件的DLL程序必须实现`DllRegisterServer`和`DllUnregisterServer`函数,以支持控件的自注册和卸载。
ActiveX控件的使用通常涉及到`CLASSID`,这是一个唯一标识控件的GUID,用于在网页中引用控件。HTML元素`<OBJECT>`通过`CLASSID`属性指定控件类型,而`Codebase`属性则指示控件的下载位置。如果浏览器找不到已注册的控件,它将从codebase指定的URL下载并注册控件。
需要注意的是,由于ActiveX控件的代码需要在网络上传输,因此压缩技术的应用可以减少下载时间。此外,如果控件依赖于其他DLL,IE需要确保这些依赖项也能够正确加载和注册。不过,随着现代浏览器对ActiveX支持的减少和安全性的考虑,开发者现在更倾向于使用其他技术,如JavaScript和WebAssembly来构建富互联网应用。