ActiveX控件
定义
ActiveX控件是遵循ActiveX规范、以组件对象模型(COM)为基础构建的可重用软件组件,支持OLE的多项功能,并可按需要定制以适配不同软件[1][4]。它可以带有自己的窗口,能够响应鼠标单击等事件,并通过包含属性和方法的接口接受宿主程序的管理,这与自动化对象的接口形式相近[4]。
它早期被称为OLE控件、OCX或OLE自定义控件,后来统一归入ActiveX名下[5]。从对象的角度看,ActiveX控件具有状态、行为和标识:状态由属性及其当前取值构成,行为对应可施加的方法,标识用于与其他对象区分,另外还带有在事件发生时发出通知的机制[5]。在文件形式上,它以进程内服务器的形态实现,多数以扩展名为ocx的动态链接库交付,在Visual C++等环境中可由MFC或活动模板库创建[1][4]。
原理
ActiveX控件的技术基础由几项相互配合的COM机制组成:COM本体提供接口协商,可连接对象负责事件通知,复合文档支持就地激活,属性页用于修改控件属性,OLE自动化提供可编程接口,对象持久性负责保存与恢复控件状态,此外还有系统提供的字体和图片对象用于绘制外观[1]。其中唯一必须实现的接口是IUnknown,其余接口按需要选配,因此控件的能力范围取决于实现了哪些接口[1]。
控件与容器之间主要靠两条通路通信:一条是容器通过调度映射调用控件公开的属性与方法,另一条是控件通过可连接对象向容器引发事件,并可在事件中携带参数以传递更多信息[4]。控件存在活动与非活动两种基本状态,传统上以是否拥有窗口区分;引入无窗口激活后这一界线不再绝对,但不少控件仍然沿用有窗口的活动方式[4]。
在网页中,控件通过object等HTML标记或脚本中的创建语句实例化,实例化时可以使用CLSID,也可以使用更易书写的ProgID,两者的关系类似IP地址与域名[6]。控件在系统中以组件的类别标识注册,是否可安全地接受脚本操作、是否可安全地从持久数据初始化,均由相应的类别声明与安全接口来标记[6]。
flowchart LR
A[HTML 页面 / 宿主程序] --> B[容器: 创建控件实例]
B --> C[CLSID 或 ProgID 定位]
C --> D[ActiveX 控件 COM 对象]
D --> E[属性与方法 dispatch]
D --> F[事件 可连接对象]
F --> A
发展历程
1996年,微软面对OLE 2.0规范的复杂性和MFC对COM支持不足的问题,对规范加以简化,并把相关技术更名为ActiveX;同年3月,微软公布了新的ActiveX开发战略[3][7]。即便经过简化,开发者仍需为控件实现约六个核心接口,微软随后以向导、ATL基类、宏和C++语言扩展等方式降低编写难度[3]。
与Internet Explorer 3.0同期,浏览器开始支持在HTML内容中承载ActiveX控件:遇到用object标记声明的控件,浏览器几乎不经用户干预便自动下载并安装[3]。这使网页能够运行更丰富的内容,也带来了平台限制与安全方面的质疑,微软此后陆续引入安装包数字签名、控件须自行声明可安全脚本化、更严格的默认安全设置以及不良控件黑名单等措施[3]。
跨平台方面,微软于1996年10月为Macintosh发布ActiveX软件开发工具包的测试版,并宣布当年晚些时候支持Solaris;1997年,NCompass Labs与微软合作推出供Netscape Navigator使用的插件以支持ActiveX[3]。ActiveX的核心技术文档由The Open Group托管,可免费获取[3]。随着.NET架构的推行,ActiveX所依托的COM被逐步视为上一代技术[8]。微软Edge仅在Internet Explorer模式下保留对ActiveX的支持,其常规扩展体系基于Chromium,与ActiveX并不兼容[3]。
应用
ActiveX控件的主要用处是让应用程序与网页快速获得现成功能,例如在页面中加入实时行情信息或动画效果,开发者无需了解控件内部实现即可把它当作预装配部件使用[2]。它可以由C++、Visual Basic、Delphi、PowerBuilder等多种支持COM的语言开发,并可运行于Windows窗体与HTML页面之中[2]。
在微软自身产品中,Internet Explorer、Microsoft Office、Microsoft Visual Studio 和 Windows Media Player 都用ActiveX控件搭建功能,同时也把自身功能封装成控件供其他程序嵌入[3]。在数据访问领域,ActiveX控件分为数据控件与数据绑定控件,前者封装数据库查询和结果行集,后者负责呈现数据并与数据控件连接[4]。在工业与机器视觉领域,也存在遵循ActiveX规范的组件工具包,涵盖成像处理、图像采集、几何运算与运动控制等功能[5]。
局限
ActiveX控件在原理上并不绑定Windows,但实际使用中绝大多数控件只能在Windows上运行,且由于内含编译后的机器码,客户端通常需要是x86架构的计算机[3]。这意味着如果网页把关键功能交给ActiveX控件实现,其可用范围就会受到明显限制;微软尽管做过跨平台努力,多数控件依然无法在各平台上通用[3]。与JavaBeans相比,ActiveX支持的编程语言更多,而JavaBeans支持的平台更多[3]。
安全模型的差别也是其局限之一。ActiveX的安全机制主要依靠Authenticode代码签名来确认组件开发者的身份,经识别的代码在浏览器内以完整权限运行,代码中的缺陷因此可能直接成为安全问题,这与当时Java采用的沙箱隔离思路不同[3]。此外,控件只有放入能够识别ActiveX的容器时才能发挥全部功能[4]。随着浏览器体系转向Chromium等新架构,ActiveX已被视为被淘汰的框架,新开发项目通常不再将其作为网页扩展方案[3]。
参见
-
组件对象模型 —— ActiveX控件所依托的基础组件规范。
-
对象链接与嵌入 —— ActiveX前身OLE技术的来源。
-
Internet Explorer —— 早期在网页中承载ActiveX控件的主要浏览器。
-
JavaBeans —— 与ActiveX同期竞争的Java组件框架。
-
活动模板库 —— 微软提供的用于编写ActiveX控件的C++模板库。
-
Authenticode —— ActiveX控件安装包所用的代码签名机制。
参考资料
- ActiveX 控件 [引用日期2026-10-29]
- [科普中国]-ActiveX控件 [引用日期2026-10-29]
- Active_X [引用日期2026-10-29]
- 导入库文件有扩展名( [引用日期2026-10-29]
- google.com 上的网页 [引用日期2026-10-29]
- Contrôles ActiveX - 跳至主要内容 跳到 Ask Learn 聊天体验 [引用日期2026-10-29]
- download-documents [引用日期2026-10-29]
- X02-160503(PDF) [引用日期2026-10-29]