组件的设计与实现

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


Com组件从OLE技术上发展而来:

Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(COM)。

COM是一种规范而不是实现,是一种面向对象的编程标准(Component ObjectModule)在c++中COM实际就为c++类,用它来实现接口进行操作。

COM对于编程语言的唯一要求是必须能够创建结构指针,并可以通过指针调用函数。COM对象通过一组或多组相关函数来访问对象中的数据,这些数据集合称为接口。

接口是一个纯虚函数的定义,不能直接创建实体,每个接口都有一个全局唯一的GUID值,可以通过这个值访问接口。

所有的接口都是从一个核心接口IUnknown派生而来,IUnknown接口包含了三个重要的方法:QueryInterface、AddRef、Release。

QueryInterface用于说明这个组件是否支持特定接口,如果支持返回接口的指针,不支持返回一个空指针。

AddRef和Release实现对COM的内存引用 的计数。当对COM第一个调用AddRef时,COM被调入内存;当调用Release,最后释放COM时,COM会从内存释放。

COM组件在使用前应该进行注册,它的一些信息随着COM组件的注册被写入到注册表中,反注册就是把组件的注册信息从注册表中删除。Windows系统中使用 RegSvr32.exe对COM组件进行注册和反注册,RegSvr32.exe调用COM组件的DllRegisterServer注册,调用DllUnRegisterServer进行反注册。如com.dll为一个组件,则控制台注册:

RegSvr32 com.dll

反注册:

RegSvr32 –ucom.dll

 

COM组件的规则:

1、 实现IUnknown规则。Com组件必须实现IUnknown接口。

2、 内存管理规则。管理内存即管理指针,接口指针的寿命管理通过调用每个com接口中的AddRef()和Release()两种方法来实现。

3、 引用计数规则。 引用程序通过计数跟踪COM实例,保证符合COM规范。

 

Com组件的设计

VS中使用ATL方便设计组件。

ATL,Active Template Library活动模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。通过活动模板库,可以建立COM组件,然后通过ASP页面中的脚本对COM对象进行调用。这种COM组件可以包含属性页、对话框等等控件。

 

COM组件的调用之 工厂化方法调用接口

工厂化函数

STDAPI  CoGetClassObject

(

       REFCLSIDrclsid,  //组件的CLSID值

       WORDdwClsContext, //组件类别

       COSERVERINFO*pServerInfo, //服务器信息,默认为NULL

       REFIIDriid, //工厂方法标识符

       LPVOID*ppv, //COM组件工厂指针

)

调用了CoGetClassObject之后得到了IClassFactory接口指针,使用IClassFactory接口调用CreateInstance得到调用的指针接口。

HRESULT CreateInstance

(      IUnknown*pUnkOuter, //指向UnKnown接口,与CoCreateInstance相同

       REFIIDriid, //调用接口标识符

       Void** ppvObject  //接口指针

)

示例:

myCom组件含有IGetRes接口,该接口含有Hello()方法,IGetResEx接口,该接口还含有HelloEx()方法,使用工厂化方法调用COM接口方法。

CoInitialize(NULL);

HRESULT hr;

CLSID clsid;

//得到myCom组件IGetRes接口指针的CLSID号

hr = CLSIDFromProgID(OLESTR(“myCom.GetRes”),&clsid);

//首先说明i一个IGetRes接口、IGetResEx接口和类工厂接口

IGetRes* ptr;

IGetResEx* ptrEx;

IClassFactory* p_Classfactory;

//首先需要得到COM 对象工厂(IClassFactory)指针

hr = GoGetClassObject(clsid, CLSCTX_INPROC_SERVER,NULL, IID_IClassFactory, (LPVOID*) &p_Classfactory);

//使用工厂化的方法得到IGetRes接口指针

P_classfactory->CreateInstance(NULL,__uuidof(IGetRes), (LPVOID*) &ptr);

//使用工厂化的方法得到IGetResEx接口指针

P_Classfactory->CreateInstance(NULL,__uuidof(IGetResEx), (LPVOID*)&ptrEX);

//调用IGetRes接口的Hello函数

Ptr->Hello();

//调用IGetResEx接口的HelloEx()函数

ptrEx->HelloEx();

CoUninitialize();

 

 

Com组件使用API调用接口函数

STDAPI CoCreateInstance

(  REFCLSID rclsid,  //组件的CLSID值

       LPUNKNOWNpUnkOuter, //指向UnKnown接口

       DWORDdwClsContext, //组件类别

       REFIIDriid, //调用接口标识符

       LPVOID*ppv, //接口指针

)

pUnkOuter 如果为NULL, 表明此对象不是聚合式对象的一部分。如果不是NULL,则指针指向一个聚合式对象的IUnKnown接口

dwClsContext 参数一般设置为CLSCTX_INPROC_SERVER

riid 是接口的GUID值,可以通过以下函数得到:

__uuidof(expression)

uuidof 得到指向expression的GUID值。

使用API 调用接口IGetRes的方法Hello()的实例:

CoInitialize(NULL);

CLSID clsid;

//得到myCom组件IGetRes接口指针的CLSID号

HRESULT hr = CLSIDFromProgID(OLESTR(“myCom.GetRes”),&clsid);

IGetRes *ptr;

//得到接口IGetRes的指针

hr = CoCreateInstance(clsid, NULL,CLSCTX_INPROC_SERVER, __uuidof(IGetRes), (LPVOID*) &ptr);

//调用IGetRes接口的Hello()函数

Ptr->Hello();

CoUninitialize();

多步骤表单向导组件设计实现指南 阅读详情

相关推荐

折叠面板组件设计实现

NutUI,大家应该不陌生吧 [鬼脸],前端开发的同学肯定是有些了解的。NutUI 是一个京东风格的移动端组件库,使用 Vue 语言来编写可以在 H5,小程序平台上的应用。目前 NutUI 拥有 70+ 组件,支持按需引用,支持 TypeScript,支持定制主题等功能,当然也支持最新的 Vue3 语法,在开发上能有效帮助研发人员提升效率,改善开发体验。言归正传,今天我们一起了解 NutUI 中折叠面板 Collapse 的实现设计,以及在开发过程中学习到的新知识点。...

m0_63247283的博客 1876

组件设计&实现一个分页组件

​ 随着前端三大框架(Vue、React、Angular)的发展,相应的也会有element-ui、ant-design等成熟的UI组件库的出现,很大程度上提高了前端开发的效率。如果提供的组件不符合业务要求的时候,需要我们自己动手实现一个合适的组件,那么,为什么要开发组件,什么是组件化思想,实现一个组件的时候我们需要考虑哪些问题? 为什么要开发组件 组件化是对实现的分层,是更有效的代...

codezha的博客 2562

Go 组件设计实现

4 位字节跳动研发工程师,带你深入剖析字节基础组件设计实现及性能优化

斌擎科技 550

vuejs 设计实现 - 组件实现原理

有了基本的结构,渲染器就能完成组件的渲染。渲染器中真正完成组件的渲染的是mountComponent函数。一个组件必须包含一个渲染函数,即render函数,并且渲染函数的返回值应该是虚拟dom。有了 queueJob 函数之后,我们可以在创建渲染副作用时使 用它,在上面这段代码中,我们使用一个对象来表示组件实例,该对象有三个属性。我们用data函数来定义组件自身的状态。为组件设计自身的状态:data。

weixin_38245947的博客 884

如何设计一个优秀的组件

阅读更多系列文章请访问我的GitHub 博客,本文示例代码请访问这里。 前言 在开发过程中,我们经常会遇到现有组件库无法满足需求,需要自己设计实现组件的情况。那么,如何才能设计一个既满足产品需求,又易于开发人员使用的组件呢?本文就以一个级联组件设计为例,探讨一下如何设计一个优质组件。 开始前准备 如果你想查看本文的 Demo 演示,请点击这里。 如果想查看源代码,请点击这里。 本文的源代码都由 TypeScript 编写,如果你对 TypeScript 不了解,可以查看TypeScript 官网 本文

Lee Chen的博客 1337

如何设计好一个组件

如何设计好一个组件

m0_60703077的博客 1357

组件设计原则

Vue 的插槽是一项强大的功能,它使得组件化开发更为灵活可复用。无论是简单的默认插槽还是复杂的作用域插槽,都为开发者提供了更多控制组件内容布局的方式。插槽的灵活性可扩展性,使得Vue应用更容易构建、维护扩展。

A12536365214的博客 560

组件滑动效果设计实现

在移动应用开发中,提供直观且流畅的用户交互是至关重要的。SwipeLayout作为一种滑动按钮组件,已经成为许多应用中不可或缺的一部分。它不仅能够实现丰富的滑动交互效果,而且还能提升用户的操作体验。SwipeLayout允许开发者在列表项、卡片视图等界面上快速添加滑动打开或关闭的按钮,适用于实现各种如删除、编辑、分享等常用操作。本章我们将深入探讨SwipeLayout的基本功能,了解它如何通过简单的配置来实现复杂的滑动行为。

duolala888的博客 1031

音乐进度条组件progress-bar的设计实现

新建组件文件(略) 引用组件(略) 组件界面设计组件内定义显示内容 开始播放时间、总时间、滑动模块 时间部分 使用数据从脚本中定义引用 滑动模块效果方式 (1)官方自带滑动组件 (2)自定义滑动元素 使用内置的滑动区域组件,构造一个可以移动的区域 属性的说明在截图注释上。 这样在加上样式就可以构成一个显示的进度条样式了 样式代码请参考在github上的文件。 ...

GrantF的博客 2026

组件设计核心:接口实现分离(C++)

接口(Interface):定义模块对外提供的功能契约,包含函数声明、数据结构等抽象描述,不涉及具体实现细节实现(Implementation):针对接口契约的具体功能实现,包含业务逻辑、算法细节、资源管理等具体代码可替换性:随时切换实现而不影响调用端可扩展性:新增功能只需实现现有接口可测试性:方便构造模拟对象进行单元测试技术隔离:业务逻辑技术细节解耦在大型软件项目中,这种设计思想能够有效应对需求变化技术演进,使系统在保持稳定性的同时具备持续迭代能力。

qq2745567641的博客 1592

Tooltip组件设计实现完整源码解析

保存

weixin_26907223的博客 1080

Vue3 弹窗组件设计实现全攻略

Vue3 弹窗组件设计实现全攻略

嗨,欢迎来到我的 CSDN 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1234

基于H5的转盘互动组件设计实现

每个状态代表转盘当前所处的行为模式,决定了哪些操作被允许。

weixin_30995917的博客 1120

vue滑块组件设计实现

用户交互:通过监听鼠标触摸事件,实现滑块的拖动功能,并提供实时的视觉反馈。状态管理:使用ref管理滑块的位置当前值,并通过事件将值传递给父组件。样式设计:定义滑块容器、轨道、进度条滑块的样式,确保组件外观美观且易于使用。事件处理:处理开始拖动、拖动中停止拖动的事件,确保滑块在用户交互时能够正确响应。

m0_63779088的博客 696

Service-Hub项目中HTTP组件支持的设计实现

Service-Hub项目中HTTP组件支持的设计实现 在现代微服务架构中,HTTP作为最基础的通信协议之一,其组件化支持对于服务编排至关重要。Service-Hub项目近期新增了对HTTP组件的原生支持,这一特性极大地扩展了平台的集成能力。本文将深入探讨这一功能的设计思路技术实现。 HTTP组件的基本设计 Service-Hub的HTTP组件设计遵循了声明式配置的理念,通过YAML模板定义H...

gitblog_07955的博客 347

【Auto-Scroll-List 组件设计实现分析】

封装的 `AutoScrollList` 是一个自动滚动列表组件,主要用于展示需要自动循环滚动的数据项,如通知、告警、任务等信息。该组件采用了组件逻辑分离的设计思路,通过自定义 Hook 实现核心滚动逻辑,提高了代码的可复用性灵活性。

weixin_37342647的博客 1218

实现级联选项_Picker 组件设计实现

全文共6680字,阅读需要17分钟前言今天的主题是 Picker 组件设计实现,Picker 组件是 NutUI 的一个拾取器组件,它用于显示一系列的值集合,用户可以滚动选择集合中一项,也可以支持多个系列的值集合供用户分别选择。我们通过一张效果图,来看看组件具体实现了什么功能。说到 NutUI, 可能有些人还不太了解,容我们先简单介绍一下。NutUI 是一套京东风格的移动端Vue组件...

weixin_42539414的博客 959

掌握VHDL中的组件设计实现

本文深入探讨了在VHDL编程中如何通过组件、程序包、函数过程来设计实现数字电路。通过示例电路的设计,展示了如何使用组件来构建复杂的电路结构,包括移位寄存器、多路复用器计数器。文章详细解释了第一种方法,即通过创建程序包来声明实例化组件,以及第二种方法,即在架构的声明部分直接进行组件声明。这两种方法提供了灵活的方式来组织复用VHDL代码,从而提高设计效率。

weixin_29097457的博客 316

歌词组件设计实现

首先需要实现的就是,在点击封面的时候,可以显示歌词页面,即在封面的时候会有一个点击事件 点击事件控制元素是否显示 定义组件过程、引用(略) 在封面上定义点击事件bindtap="onChangeLyricShow" 在脚本中我们定义一个全局bool变量,判断当前是歌词还是封面。 在事件中进行取反数据绑定 onChangeLyricShow(){ this.setData({ ...

GrantF的博客 684
上一篇: MFC笔记(四)
下一篇: 动态链接库DLL
Crazy_Tortoise
博客等级 码龄16年 47粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值