深入探讨 ActiveX 控件的高级特性和实际应用

在上一篇文章中,我们介绍了如何创建一个简单的 ActiveX 控件,并了解了其基本概念和实现方法。现在我们将进一步探讨 ActiveX 控件的一些高级特性,以及它们在过去的应用场景中的实际使用。

高级特性概览
  1. 属性(Properties)

    • ActiveX 控件可以定义自己的属性,这些属性可以在宿主应用程序中被读取或设置。通过属性,控件可以与外部环境进行交互。
  2. 方法(Methods)

    • 方法是控件提供的功能接口,允许宿主应用程序调用以执行特定任务。例如,播放视频、加载文件等。
  3. 事件(Events)

    • 事件允许控件向宿主应用程序发送通知,比如用户点击按钮时触发某个操作。这使得控件能够响应用户的动作并与宿主程序互动。
  4. 持久化(Persistence)

    • 持久化意味着保存控件的状态信息,以便下次加载时恢复。ActiveX 支持多种持久化形式,如流式存储、属性表等。
  5. 线程模型(Threading Model)

    • ActiveX 控件可以根据需要选择不同的线程模型,包括单线程单元(STA)、多线程单元(MTA),以及自由线程(Free-threaded)。这影响着控件如何处理并发请求。
  6. 安全性和权限

    • 安全性是一个重要的考虑因素,尤其是在 Web 环境下。开发者可以通过数字签名等方式来确保控件的安全分发,并且遵守微软的安全策略。
实际应用场景

尽管 ActiveX 技术已经不再是主流,但在它盛行的时代里,确实有许多成功的应用案例:

  • 媒体播放器:许多早期的在线视频网站依赖于 ActiveX 控件来提供多媒体播放功能。Windows Media Player 插件就是一个典型的例子。

  • 办公自动化:Office 应用程序如 Word 和 Excel 提供了丰富的 ActiveX 控件,用于增强文档编辑体验,例如嵌入图表、数据库连接等功能。

  • 企业级解决方案:一些企业内部网(Intranet)应用程序利用 ActiveX 来构建定制化的业务逻辑,特别是那些需要紧密集成 Windows 特性的场合。

  • 游戏和娱乐:某些浏览器游戏中也使用了 ActiveX 技术,为用户提供更丰富的交互体验。

示例:带属性和方法的 ActiveX 控件

为了展示 ActiveX 的高级特性,我们将扩展之前创建的简单控件,添加一个文本属性和一个显示消息的方法。

添加属性

首先,在 Visual Studio 中打开你的项目,找到 CHelloWorldCtrl 类,并添加一个新的属性,比如叫做 Text。你需要修改 .idl 文件来声明这个属性,并在类中实现相应的 getter 和 setter 函数。

// 在 .idl 文件中添加以下行
[id(1), propput] HRESULT Text([in] BSTR newVal);
[id(1), propget] HRESULT Text([out, retval] BSTR* pVal);// 在 CHelloWorldCtrl 类中添加以下成员变量和方法
private:CComBSTR m_strText;public:STDMETHOD(get_Text)(BSTR* pVal);STDMETHOD(put_Text)(BSTR newVal);

然后实现这两个方法:

STDMETHODIMP CHelloWorldCtrl::get_Text(BSTR* pVal)
{if (!pVal) return E_POINTER;*pVal = SysAllocString(m_strText);return S_OK;
}STDMETHODIMP CHelloWorldCtrl::put_Text(BSTR newVal)
{m_strText = newVal;return FireViewChange(); // 触发视图更新
}
添加方法

接下来,我们添加一个名为 ShowMessage 的方法,它会弹出一个带有当前文本值的消息框。

// 在 .idl 文件中添加以下行
[id(2)] HRESULT ShowMessage();// 在 CHelloWorldCtrl 类中添加以下方法
public:STDMETHOD(ShowMessage)();

实现 ShowMessage 方法:

STDMETHODIMP CHelloWorldCtrl::ShowMessage()
{::MessageBox(NULL, m_strText, _T("ActiveX Message"), MB_OK);return S_OK;
}
使用新的属性和方法

当在 HTML 页面中使用此控件时,你可以像这样设置属性并调用方法:

<object id="helloWorldCtrl" classid="clsid:YOUR_CLSID_HERE"width="200" height="100">
</object><script type="text/javascript">document.getElementById('helloWorldCtrl').Text = 'Hello from JavaScript!';document.getElementById('helloWorldCtrl').ShowMessage();
</script>

请注意,以上代码片段仅适用于支持 ActiveX 的旧版 Internet Explorer 浏览器。由于现代浏览器不再支持 ActiveX 技术,因此这段代码可能无法在最新的浏览器环境中正常工作。

结论

本篇文章详细介绍了 ActiveX 控件的几个关键高级特性,并通过实例展示了如何添加属性和方法。虽然 ActiveX 已经逐渐退出历史舞台,但它曾经在 Windows 平台上扮演过重要角色,学习它的实现有助于理解早期 Web 开发技术和 COM 组件编程模式。对于现在的开发来说,应该更多地关注跨平台兼容的标准技术栈,如 HTML5、CSS3 和 JavaScript。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35351.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

网站打开速度测试工具:互联网优化的得力助手

在信息飞速流转的互联网时代&#xff0c;网站如同企业与用户对话的窗口&#xff0c;其打开速度直接关乎用户体验&#xff0c;乃至业务的成败。所幸&#xff0c;一系列专业的网站打开速度测试工具应运而生&#xff0c;它们宛如幕后的技术侦探&#xff0c;精准剖析网站性能&#…

shell脚本实战案例

文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑&#xff1a;在Windows系统写了一个脚本&#xff0c;比如上面&#xff0c;随后上传到服务&#xff0c;执行会报错 原因&#xff1a; 解决方案&#xff1a;在linux系统touch文件&#xff0c;并通过vim添加内容&…

Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!

今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR&#xff0c;可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像&#xff08;第一行&#xff09;和二维码图像&#xff08;第二行&#xff09;。生成的二维码不仅忠实地保留…

数据结构---队列(Queue)

1. 简介 队列&#xff08;Queue&#xff09;是一种常用的数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则。这意味着第一个进入队列的元素将是第一个被移除的元素。队列在计算机科学中有着广泛的应用&#xff0c;比如任…

玩游戏没有flash插件的解决方案(No Flash)

一、概述 在网页游戏开发领域&#xff0c;Flash和H5是两种主流的技术。Flash游戏曾经占据主导地位&#xff0c;但随着HTML5技术的发展和浏览器对Flash支持的逐渐减少&#xff0c;H5游戏逐渐成为主流。本教程将详细介绍Flash和H5的区别&#xff0c;并提供将Flash游戏转换为H5游戏…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键&#xff0c;打开如下界面&#xff0c;选择【系统】&#xff1a; 2、选择【屏幕】-【高级显示设置】 如下位置&#xff0c;显示屏幕的刷新率&#xff1a;60Hz 如果可以更改&#xff0c;则选择更高的刷新率&#xff0c;有助于电脑使用起来界面更加流…

新书速览|循序渐进Node.js企业级开发实践

《循序渐进Node.js企业级开发实践》 1 本书内容 《循序渐进Node.js企业级开发实践》结合作者多年一线开发实践&#xff0c;系统地介绍了Node.js技术栈及其在企业级开发中的应用。全书共分5部分&#xff0c;第1部分基础知识&#xff08;第1&#xff5e;3章&#xff09;&#xf…

AUTOSAR AP和CP的安全要求规范(Safety Req)详细解读

一、规范的编制的背景原因 编制该规范的原因 确保系统安全性和可靠性 随着汽车电子系统日益复杂&#xff0c;功能不断增加&#xff0c;对安全性和可靠性的要求也越来越高。该规范为AUTOSAR平台在安全执行、配置、更新、信息交换、数据处理等多方面制定了明确要求&#xff0c;…

数仓技术hive与oracle对比(四)

问题处理 sqoop导入异常 将oracle数据库中的表&#xff0c;用sqoop导入hive时&#xff0c;如果表中字段值含有“&#xff0c;”&#xff0c;会导致导入hive后&#xff0c;每一行所有字段的内容都放在了第一个字段&#xff0c;其他字段均没有值。这是因为hive底层是以文件的形…

流网络等价性证明:边分解后的最大流保持不变

流网络等价性证明:边分解后的最大流保持不变 问题描述证明思路伪代码C 代码实现解释问题描述 在流网络中,证明将一条边分解为两条边所得到的是一个等价的网络。具体来说,假设流网络 $ G $ 包含边 $ (u, v) $,我们以如下方式创建一个新的流网络 $ G’ $: 创建一个新结点 $…

应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建

水下无人航行器数字样机功能模型构建 一、项目背景 为响应水下装备系统研制数字化转型及装备系统数字样机建设的需要&#xff0c;以某型号水下无人航行器&#xff08;Underwater Unmanned Vehicle&#xff0c;UUV&#xff09;为例&#xff0c;构建UUV数字样机1.0功能模型。针对…

RabbitMQ七种工作模式之简单模式, 工作队列模式, 发布订阅模式, 路由模式, 通配符模式

文章目录 一. Simple(简单模式)公共代码:生产者:消费者: 二. Work Queue(工作队列模式)公共代码:生产者:消费者1, 消费者2(代码相同): 三. Publish/Subscribe(发布/订阅模式)公共代码:生产者:消费者: 四. Routing(路由模式)公共代码:消费者: 五. Topics(通配符模式)公共代码:生…

前端知识1html

VScode一些快捷键 Ctrl/——注释 !——生成html框架元素 *n——生成n个标签 直接书写html的名字回车生成对应的标签 常见标签 span&#xff1a; <span style"color: red;">hello</span> <span>demo</span> span实现&#xff1a; 标题…

Push an existing folder和Push an existing Git repository的区别

Push an existing folder 和 Push an existing Git repository 是在使用 Git 服务&#xff08;如 GitHub、GitLab、Bitbucket 等&#xff09;时两个常见的操作选项。它们的区别主要体现在项目的初始化和版本控制状态上&#xff1a; 1. Push an existing folder 适用场景&#…

Netty入门(快速了解以及使用netty)

二. Netty 入门 1. 概述 1.1 Netty 是什么&#xff1f; Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.Netty 是一个异步的、基于事件驱动的网络应用框架&…

Zemax 中 ZBF 文件激光传播的描述

激光传播是指激光束在空间或介质中传播的方式。激光的独特特性&#xff0c;例如相干性、单色性和准直性&#xff0c;使其行为与普通光源不同。了解激光传播的原理在光学、通信、医疗技术和科学研究等领域至关重要。 激光产生高斯光束&#xff0c;其中强度在光束横截面上服从高…

DataSophon集成CMAK KafkaManager

本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件&#xff1a;DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…

go基础总结

最近参加字节跳动后端青训营&#xff0c;技术栈是go。go跟Java还是有些区别的&#xff0c;所以自己做点笔记来总结总结go的基础语法 数据类型 go的数据类型有以下几类&#xff1a; 数值类型&#xff1a;整形分为(u)int8、(u)int16、(u)int32、byte、rune、uintptr…&#xf…

docker环境搭建

目录 环境配置指定docker镜像源 环境配置 使用ubuntu20版本 最好先修改一下镜像源&#xff0c;不然要下20分钟 sudo apt install docker.io还需要装以下这些 sudo apt-get install ca-certificates sudo apt-get install curl sudo apt-get install gnupg sudo apt-get ins…

策略模式实战 - 鸭展

该示例出自著名的《HeadFirst》系列的《HeadFirst设计模式》图书的第一个设计模式。用一个鸭子展览的小应用&#xff0c;一步步揭示了如何引入和使用策略模式将示例改造的完美一些。 文章目录 红头鸭与绿头鸭橡皮鸭和诱饵鸭用接口代替继承组合关系与策略模式 红头鸭与绿头鸭 当…