COM组件技术之MFC应用(北大教材)
VS2024之MFC入门到精通教程
VS2024之MFC入门到精通教程MFC(Microsoft Foundation Classes)是微软公司开发的一套基于C++的应用程序框架,旨在简化Windows应用程序的开发。
本文将为你介绍如何从MFC的入门到精通。
MFC是一个功能强大且复杂的框架,因此在学习MFC之前,你应该对C++语言有一定的了解。
了解基本的C++语法、类和对象的概念以及面向对象编程的思想是非常重要的。
首先,你需要安装Visual Studio 2024开发环境,这是一个包含MFC框架的集成开发环境。
安装完成后,你可以创建一个新的MFC应用程序项目。
在创建项目时,你可以选择使用MFC应用程序向导来生成基本的MFC 应用程序结构。
这个向导将帮助你创建一个带有窗口、对话框和控件的桌面应用程序。
一旦你创建了MFC应用程序项目,你就可以开始学习如何操作和管理窗口、对话框和控件了。
MFC提供了一组类和函数来处理用户界面相关的任务,如创建窗口、处理消息和响应用户输入等。
了解和掌握MFC的消息映射机制也是非常重要的。
MFC使用消息映射来处理窗口消息,如点击按钮、鼠标移动或键盘按键等。
你需要了解如何在MFC应用程序中添加消息映射函数,以便正确地处理用户的操作。
此外,MFC还提供了许多其他功能和特性,如数据库访问、多线程编程和国际化支持等。
如果你想进一步提升你的MFC编程技能,你可以深入学习这些领域。
最后,记得在学习MFC过程中多做实践。
尝试创建自己的项目并实现一些简单的功能,这将帮助你更好地理解和应用MFC框架。
总结起来,MFC是Windows应用程序开发的重要工具之一,它提供了丰富的类和函数来简化应用程序开发。
通过学习MFC的基本概念、操作和技巧,你可以成为一名熟练的MFC开发者。
《MFC编程及应用》课程设计报告
《MFC编程及应用》课程设计报告题目: 简易型科学计算器学号: 姓名:****: ***时间: 2012年5月16日1、设计步骤a)工程建立本工程建立的是一个基于对话框的应用程序。
b)类中新增变量的作用m_inputstr : CEdit类型, 用于与程序中编辑框相关联;m_FormerBase :用于记录上一次是出于何种进制之下, 便于进制转换;c)CMathString: 用于对字符串进行逆波兰表达式的转换并计算结果d)需处理的消息的详细代码对按钮0(OnBnClickedButton0)的响应函数:void CMy1106840420Dlg::OnBnClickedButton0(){CString temp;//定义一个CString对象this->UpdateData(true);//从编辑框获得m_inputstr的值m_inputstr.GetWindowText(temp);//获取字符串并存入temp中temp += '0';//在字符串末尾添加字符‘0’this->m_inputstr.SetWindowText(temp);//将字符串设置回m_inputstr中this->UpdateData(false);//更新数据, 编辑框显示}对按钮1(OnBnClickedButton1)、2(OnBnClickedButton2)、3(OnBnClickedButton3)、4(OnBnClickedButton4)、5(OnBnClickedButton5)、6(OnBnClickedButton6)、7(OnBnClickedButton7)、8(OnBnClickedButton8)、9(OnBnClickedButton9)、A(OnBnClickedButtonA)、B(OnBnClickedButtonB)、C(OnBnClickedButtonC)、D(OnBnClickedButtonD)、E(OnBnClickedButtonE)、F(OnBnClickedButtonF)、左括号(OnBnClickedButtonLbracket)、右括号(OnBnClickedButtonRbracket)、+(OnBnClickedButtonAdd)、—(OnBnClickedButtonMinus)、×(OnBnClickedButtonMultiply)、/(OnBnClickedButtonDiv)、小数点(OnBnClickedButtonPoint)、PI (OnBnClickedButtonPi)的响应函数与按钮0类似, 仅末尾添加的字符变为相应的字符。
COM技术
COM技术什么是COM所谓COM(Componet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。
通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。
什么是ATLATL是ActiveX Template Library的缩写,它是一套C++模板库。
使用ATL能够快速地开发出高效、简洁的代码,同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。
COM的开发方法在ATL产生以前,开发COM组件的方法主要有两种:一是使用COMSDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。
直接使用COMSDK开发COM组件是最基本也是最灵活的方式。
通过使用Microsoft提供的开发包,我们可以直接编写COM程序。
但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解;另一方面,直接使用COMSDK 要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。
这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。
虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COMSDK不是一种理想的开发方式。
使用MFC提供的COM支持开发COM应用可以说在使用COMSDK基础上提高了自动化程度,缩短了开发时间。
MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。
为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。
什么是COM组件
什么是COM组件(源于互联网)COM是开发软件组件的一种方法。
组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。
开发自定义的COM组件就如同开发动态的,面向对象的API。
多个COM对象可以连接起来形成应用程序或组件系统。
COM是Component Object Model (组件对象模型)的缩写。
用户需要什么样的软件产品?这是一个多选题,但高效,健壮是肯定会被选种的。
作为一名软件开发人员如何做才能满足用户的需要呢?必须要保证升级应用时不破坏与以前版本的向后兼容性。
必须做到扩展系统服务时不依赖特定的操作系统。
面向对象的程序设计显然是一次革命性的改变。
采用面向对象的设计方法我们可以很容易的把要解决的问题事物抽象成各种类,并将内部动作封装隐藏起来,只提供一些接口。
但这并没有完全解决我们的问题。
昨天我在《程序员》杂志上看到,现在是后OO时代,那OO以后是什么呢?应该是面向组件吧。
COM component(COM组件)COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。
在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块;等等。
COM是开发软件组件的一种方法。
组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。
开发自定义的COM组件就如同开发动态的,面向对象的API。
多个COM对象可以连接起来形成应用程序或组件系统。
并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。
Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。
MFC基础教程
MFC基础教程MFC(Microsoft Foundation Class)是微软公司开发的一套用于Windows平台的C++库,提供了一系列的类和函数,可以帮助开发者快速构建Windows应用程序。
MFC是一种基于消息驱动的编程模型,它将用户输入、操作系统消息和应用程序功能相结合,实现了高效的界面设计和响应。
对于初学者来说,学习MFC可以帮助他们了解Windows编程的基本概念和原则,打下良好的编程基础。
下面将介绍一些适合初学者的MFC基础教程。
1.教程名称:《MFC入门教程》简介:这是一份非常适合初学者的MFC入门教程,它从最基础的概念和原理开始介绍,通过实例代码和详细的解释,帮助读者快速上手MFC编程。
这个教程包含了Windows消息处理、界面设计、控件使用和文件操作等基本内容。
2.教程名称:《MFC编程入门》简介:这个教程以实例为主,通过一系列的小项目,逐步介绍MFC编程的各个方面。
每个项目都包含了完整的源代码和详细的解释,读者可以通过跟着教程一步一步实践,掌握MFC编程的基本技巧和方法。
3.教程名称:《MFC程序设计基础》简介:这是一本经典的MFC教材,适合初学者系统地学习MFC编程。
它介绍了MFC的基本概念、类结构和消息传递机制,并通过大量的示例代码演示了MFC的各种用法和技巧。
读者可以通过阅读这本书,深入理解MFC的原理和设计思想。
4.教程名称:《MFC实战开发入门》简介:这个教程以实际项目为例,引导读者从零开始一步一步开发一个完整的MFC应用程序。
通过这个项目实战,读者可以学习到MFC的设计流程、界面布局、数据处理和文件IO等实际编程中的常用技巧。
以上是几个适合初学者的MFC基础教程,它们覆盖了MFC编程的基本概念和常用技巧,可以帮助初学者快速入门。
当然,MFC编程是一个复杂的主题,除了阅读教程,多做实际项目和练习也是提高自己的有效途径。
希望对初学者有所帮助!。
COM原理与应用
作者简介潘爱民,浙江海宁人,获得了南开大学数学学士学位,清华大学工学硕士学位,以及北京大学计算机科学博士学位。
他从中学时代开始接触计算机编程,经历了从DOS到Windows各种版本的发展历程。
潘爱民曾经长期从事软件技术的研究和开发工作,撰写了大量软件技术文章,1999年曾经是《微电脑世界》杂志社的合作专家。
他著写了《COM原理与应用》(1999年出版),翻译了多部经典名作,如《Visual C++技术内幕》(第四、六版)、《C++ Primer中文版》(第三版)、《COM本质论》、《计算机网络》(第四版)等。
从2001年开始,潘爱民在北京大学计算机科学技术系承担研究生课程教学,共讲授了三门课程:《组件技术》、《网络与信息安全》和《程序开发环境分析与实践》,深受学生欢迎。
2006年秋季在清华大学软件科学实验班讲授《程序设计与算法基础》课程。
潘爱民获得了2001年微软亚洲研究院“微软学者”称号,2002年度北京大学优秀教学奖。
他现在微软亚洲研究院从事系统与安全方向的研究工作。
编辑推荐全书分为三部分,第一部分为COM基础,第二部分为COM扩展,第三部分为COM应用与发展,介绍了组件化程序设计思想以及多层软件结构模型。
读者在学习了COM的基本原理之后,结合MTS和COM+所倡导的一些概念,就可以从更高的层次来理解和使用COM及COM+了。
本书简介本书不仅介绍了COM的基本原理及其扩展知识,还讲述了MTS及COM+的一些知识。
全书分为三部分,第一部分为COM基础,第二部分为COM扩展,第三部分为COM应用与发展,介绍了组件化程序设计思想以及多层软件结构模型。
目录引言第1部分 COM原理 第1章 概述 1.1 COM的起源 1.1.1 0LE的发展历史 1.1.2 组件的产生 1.1.3 面向对象的组件模型——COM 1.2 COM结构 1.2.1 对象与接口 1.2.2 客户/服务器模型 1.2.3 COM库 1.3 COM特性 1.3.1 语言无关性 1.3.2 进程透明特性 1.3.3 可重用性 1.4 COM的发展前景 1.4.1 COM与Windows操作系统 1.4.2 COM与数据库 1.4.3 COM与Intranet应用 1.4.4 COM与Internet 第2章 COM对象和接口 2.1 COM对象 2.1.1 COM对象的标识——CLSID 2.1.2 COM对象与C++对象的 2.2 COM接口 2.2.1 从API到COM接口 2.2.2 接口定义和标识 2.2.3 用C++语言定义接口 2.2.4 接口描述语言IDL 2.2.5 接口的内存模型 2.2.6 接口的一些特点 2.3 IUnknown接口 2.3.1 引用计数 2.3.2 实现引用计数 2.3.3 使用引用计数规则 2.3.4 接口查询 2.3.5 COM对象的接口原则 2.3.6 QueryInterface成员函数的实现 2.3.7 COM对象和接口图示法 2.4 字典组件例子程序 2.4.1 组件程序DictComp 2.4.2 客户程序DictCtrl 第3章 COM的实现 3.1 进程内组件和进程外组件 3.1.1 进程内组件 3.1.2 进程外组件 3.2 通过注册表管理COM对象 3.2.1 注册表结构 3.2.2 COM组件注册信息 3.2.3 COM组件的注册操作 3.3 类厂(c1assfactory) 3.3.1 类厂和DllGetObjectClass函数 3.3.2 COM库与类厂的交互 3.3.3 类厂的实现 3.3.4 类厂对组件生存期的控制 3.4 COM库 3.4.1 COM库的初始化 3.4.2 COM库的内存管理 3.4.3 组件程序的装载和卸载 3.4.4 常用函数和HRESULT 3.5 COM实现过程 3.5.1 进程内组件与客户的协作过程 3.5.2 进程外组件与客户的协作过程 3.6 字典组件例子程序的实现 3.6.1 字典组件类厂的实现 3.6.2 字典对象的实现 3.6.3 全局引出函数的实现 3.6.4 客户程序DictCtrl 第4章 COM特性 4.1 可重用性:包容和聚合 4.1.1 包容和聚合 4.1.2 包容实现 4.1.3 聚合实现 4.1.4 聚合例子程序 4.2 进程透明性 4.2.1 列集(marshaling) 4.2.2 自定义列集 4.2.3 标准列集 4.2.4 标准列集的实现 4.2.5 进程外组件例子程序 4.3 安全性 4.3.1 WindowsNT安全机制 4.3.2 激活安全性 4.3.3 调用安全性 4.4 多线程特性 4.4.1 Win32线程和COM线程 4.4.2 列集和同步 4.4.3 套间线程 4.4.4 自由线程 4.4.5 进程内组件的线程模型 第5章 用VisualC++开发COM应用 5.1 Win32SDK和MFC介绍 5.1.1 Win32SDK 5.1.2 MFC基础:应用类和窗口类 5.1.3 MFC应用结构 5.1.4 MFC库结构 5.2 MFC对COM应用的支持 5.2.1 用嵌套类实现COM接口 5.2.2 接口映射表 5.2.3 CCmdTarget类实现IUnknown 5.2.4 COM引出函数和类厂实现 5.2.5 MFC对COM支持小结 5.3 用VisualC++开发COM应用 5.3.1 利用AppWizard创建COM程序工程框架 5.3.2 利用C1assWizard添加COM对象类 5.3.3 ATL介绍 5.4 VisualC++与Activex应用 5.4.1 MFC对自动化的支持 5.4.2 MFC对Activex控制的支持 5.4.3 MFC对复合文档的支持第2部分 COM扩展 第6章 可连接对象 6.1 可连接对象结构模型 6.1.1 客户与可连接对象的关系 6.1.2 可连接对象的基本结构 6.1.3 客户方基本结构 6.2 实现可连接对象(源对象) 6.2.1 枚举器 6.2.2 源对象和IConnectionPointContainer接口 6.2.3 连接点和IConnectionPoint接口 6.2.4 建立连接过程 6.3 客户—源对象—接收器的协作过程 6.3.1 接收器的实现 6.3.2 事件的激发和处理 6.3.3 与出接口有关的类型信息 6.4 可连接对象的程序实现 6.4.1 用IDispatch接口作为出接口 6.4.2 MFC对连接和事件的支持 6.4.3 用MFC实现源对象 6.4.4 用MFC在客户程序中实现接收器 第7章 结构化存储 7.1 结构化存储基础 7.1.1 从文件系统进展到结构化存储 7.1.2 存储对象和流对象 7.1.3 用结构化存储设计应用 7.2 结构化存储特性 7.2.1 访问模式 7.2.2 事务机制 7.2.3 命名规则 7.2.4 增量访问 7.3 结构化存储实现:复合文档 7.3.1 LockBytes对象和ILockBytes接口 7.3.2 复合文档API函数介绍 7.3.3 零内存保存特性和IRootStorage接口 7.3.4 存储对象.流对象和文件的CLSID信息 7.3.5 复合文档与结构化存储 7.4 永久对象实现 7.4.1 永久接口 7.4.2 永久对象的存储特性 7.4.3 永久对象例子程序 7.4.4 复合文档例子程序 7.5 本章小结 第8章 命名和绑定技术 8.1 名字技术基础 8.1.1 COM名字对象 8.1.2 使用名字对象:绑定过程 8.2 IMoniker接口 8.2.1 名字管理 8.2.2 利用IMoniker实现绑定 8.2.3 管理复合名字对象 8.2.4 名字解析 8.3 复合名字对象 8.3.1 复合名字对象结构 8.3.2 ROT和绑定环境对象 8.3.3 复合名字对象绑定过程的剖析 8.3.4 Io1eItemContainer接口 8.4 COM名字对象分类 8.4.1 COM提供的系统名字对象 8.4.2 URL名字对象 8.4.3 自定义名字对象 8.5 COM名字对象的应用 8.5.1 服务程序中名字对象的应用 8.5.2 客户程序中名字对象的应用 第9章 统一数据传输 9.1 统一数据传输基础 9.1.1 数据交换与传输协议的分离 9.1.2 应用:剪贴板和拖—放 9.2 数据传输机制 9.2.1 数据结构FORMATETC和STGMEDIUM 9.2.2 数据对象和IDataObject接口 9.2.3 通报连接机制 9.2.4 有关数据对象的小结下载后 点击此处查看更多内容。
什么是COM如何使用COM
什么是COM,如何使用COM本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。
内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。
本文不包括如何编写自己的COM对象和接口。
COM即组件对象模型,是Component Object Model 取前三个字母的缩写,这三个字母在当今Windows的世界中随处可见。
随时涌现出来的大把大把的新技术都以COM为基础。
各种文档中也充斥着诸如COM对象、接口、服务器之类的术语。
因此,对于一个程序员来说,不仅要掌握使用COM的方法,而且还要彻底熟悉COM的所有一切。
本文由浅入深描述COM的内在运行机制,教你如何使用第三方提供的COM 对象(以Windows 外壳组件Shell为例)。
读完本文后,你就能掌握如何使用Windows操作系统中内建的组件和第三方提供的COM对象。
本文假设你精通C++语言。
在例子代码中使用了一点MFC和ATL,如果你不熟悉MFC和ATL也没关系,本文会对这些代码进行完全透彻的解释。
本文包括以下几个部分:COM——到底是什么?——COM标准的要点介绍,它被设计用来解决什么问题基本元素的定义——COM术语以及这些术语的含义使用和处理COM对象——如何创建、使用和销毁COM对象基本接口——描述IUnknown基本接口及其方法掌握串的处理——在COM代码中如何处理串应用COM技术——例子代码,举例说明本文所讨论的所有概念处理HRESULT——HRESULT类型描述,如何监测错误及成功代码COM——到底是什么简单地说,COM是一种跨应用和语言共享二进制代码的方法。
与C++不同,它提倡源代码重用。
ATL便是一个很好的例证。
源码级重用虽然好,但只能用于C++。
它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。
Windows使用DLLs在二进制级共享代码。
这也是Windows程序运行的关键——重用kernel32.dll, user32.dll等。
COM培训教程
COM培训教程COM(Component Object Model)是一种面向对象的API(Application Programming Interface),最初由微软公司提出。
它允许软件开发人员通过标准接口来实现模块化的设计,使得不同软件之间可以互相通信和互相合作。
因此,COM的应用范围非常广泛,从操作系统到企业级应用程序,再到桌面应用程序和Web应用程序,都可以使用COM来实现。
尽管COM的范围如此广泛,但它的学习曲线是相当陡峭的。
为了成为一名合格的COM开发人员,你需要掌握一些核心的概念和技术。
以下是一些与COM相关的培训教程,可帮助你入门:1. COM基础知识:了解COM的基本概念和体系结构。
这些基础知识包括COM对象,接口,类,组件等。
你需要掌握如何定义和实现COM接口,如何注册COM组件,并理解COM 对象的生命周期。
2. COM组件开发:学习如何编写COM组件。
这涉及到使用COM接口、类和对象模型、COM+和MFC等。
这些教程通常介绍COM组件的编写和测试方法、COM对象的创建和释放方法以及组件的注册和部署。
3. COM高级编程:继续学习COM开发的更高级和复杂的技术。
这包括使用ATL(Active Template Library)和OLE Automation等。
ATL是一种用于快速开发COM组件的C++模板库,而OLE Automation是一种可以使非COM应用程序与COM 组件进行交互的技术。
4. COM应用程序开发:学习如何使用COM来构建应用程序,如Office、Visual Studio和Internet Explorer等。
这些教程主要讲解如何使用COM来调用其他应用程序中的COM组件,以及如何使用COM进行跨平台通信。
5. COM安全:学习如何保护COM组件免受恶意软件攻击。
这些教程通常会探讨如何使用COM+和Windows身份验证等技术来保护你的COM组件。
COM组件三个最基本的接口类和使用COM库的三种方法
COM组件三个最基本的接口类//VC6中使用COM库的三种方法COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。
COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是QueryInterface、AddRef、Release。
这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。
QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。
引用计数也是COM中的一个非常重要的概念。
大体上简单的说来可以这么理解,COM组件是个DLL,当客户程序要用它时就要把它装到内存里。
另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它。
但实际上DLL只装载了一次,即内存中只有一个COM组件,那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用,所以只能由COM组件自己来负责。
所以出现了引用计数的概念,COM维持一个计数,记录当前有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放它的时侯,COM知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了。
引用计数是COM编程里非常容易出错的一个地方,但所幸VC的各种各样的类库里已经基本上把AddRef的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过AddRef,我们只需在适当的时侯调用Release。
至少有两个时侯要记住调用Release,第一个是调用了QueryInterface以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查MSDN 以确定某个函数内部是否调用了AddRef,如果是的话那调用Release的责任就要归你了。
IUnknown的这三个函数的实现非常规范但也非常烦琐,容易出错,所幸的事我们可能永远也不需要自己来实现它们。
COM 技术介绍
COM 技术介绍最近做DSHOW开发,由于FILTER需要按自己的协议编写,所以要求对COM组件技术有一定了解,今天饿补了一下:一、COM介绍1、定义(Component Object Model)COM是微软公司的最高级的,包罗万象的二进制通讯规范(也就是说是大家都要遵守的合同)。
用于软件组件间跨进程,跨机器,和操作系统进行交互操作。
COM是透明位置的。
它可以在EXE,DLL或者远程机器上使用。
OLE是一个主要与用户界面相关的高级功能的集合。
COM和OLE的概念界限原本就不清晰,总是容易混淆。
2、历史OLE(Object Linking & Embedding )是1991年首次出现的(是WINDOWS3. 1自带的)。
OLE最初的含义是对象链接和嵌入。
当时用DDE(动态数据交换)作为底层通讯协议。
1993,COM首次出现。
微软推出OLE2.0,开始用COM代替DDE作为底层通讯协议。
这也是COM第一个重要的用途。
1996年,大多数开发人员开始编写32位的WIN95应用程序。
他们发现,OL E使用COM的方式是一种非常好的设计软件的方法。
开发人员开始使用类似的方法编写自己的对象和界面。
另外,操作系统也开始要求使用COM技术编程,如编写WIN95用户界面。
这些即不是OLE,也不是AUTOMATION,那么他到底是什么呢?这个属于大多数人倾向于使用COM。
3、发展1996年,微软推出NT4.0,DCOM首次出现,作为NT的一部分。
它实现了将COM在分布式系统中的应用。
1997年开始流行ATL。
COM作为一种技术规范,最早是由C语言来实现的,但是实现起来比较复杂。
出现VC以后,又对COM进行了预制和封装,大大简化COM应用的开发。
这就是ATL(Active Template Library)。
4、现状我们经常见到的用途:使用外来控件。
特别是在网页上使用ACTIVEX控件。
ADOWORD/EXCEL的应用。
MFC基础知识
AfxRegisterWndClass:注册用于创建Windows窗口的窗口类
24
8.4应用程序向导
25
26
27
28
29
30
31
32
15
5.控件类
控件子层次结构包括若干类,使用这些类可建立静态文本、 命令按钮、位图按钮、列表框、组合框、滚动条、编辑框等。 这些直观控件为Windows应用程序提供了各种输入和显示界面。
6.控件条类:CControlBar类
控件条子层次结构为工具条、状态条、对话条和分割窗 口建立模型。该类是CToolBar、CStatusBar、CDialogBar的 基类,负责管理工具条、状态条、对话条的一些成员函数。控 件条指的是连接在主窗口框架的顶部或底部的小窗口
19
产生异常的原因描述将储存在异常对象的 m_cause数据成员中。
例如CArchiveException 类的m_cause数据成员 的可能值如下:
• badClass:不能读错误对象类型中的内容 • badIndex:无效文件格式 • badSchema:无效对象版本 • endOfFile:到达文件尾 • Generic:不明异常 • None:无异常 • readOnly:试图向只读文件进行写操作 • writeOnly:试图向只写文件进行读操作
2
是用来编 写Windows 应用程序 的C++类集
以层次结构组织 封装了大部分API函数 提供了图形环境下应用程序的框架 提供了创建应用程序的组件
提供了大量的基类供程序员根据不同的应用环境进行扩充 MFC
允许在编程过程中自定义和扩展应用程序中的类
较好的移植性,可移植于众多的平台
MFC还很好地保持了程序的向下兼容性
mfc面试知识点总结
mfc面试知识点总结MFC(Microsoft Foundation Class)是微软公司开发的一套 C++ 库,用于简化 Windows 应用程序的开发。
MFC 提供了一系列的类和函数,用于处理 windows 窗口、消息、事件等,使得开发者能够更快速地完成 Windows 程序的开发。
在 MFC 的面试中,通常会涉及到一些基础知识和高级知识,下面就来总结一些常见的 MFC 面试知识点。
一、MFC 的基本概念1. MFC 是什么?MFC 是 Microsoft Foundation Class 的简称,是微软公司提供的用于简化 Windows 应用程序的开发的一套 C++ 类库。
2. MFC 的特点有哪些?MFC 的特点包括易学易用、功能强大、提供了丰富的类库和工具等。
3. MFC 和 Win32 API 有什么区别?MFC 是建立在 Win32 API 之上的,它封装了 Win32 API,提供了更加高层次的接口,使得开发 Windows 应用程序更加简单和方便。
4. MFC 和 ATL 有什么区别?MFC 是面向传统 Windows 应用程序的开发框架,而 ATL 是为开发高效的 COM 组件而设计的,两者目标不同。
5. MFC 和 .Net 的关系是什么?MFC 是基于 C++ 的框架,而 .Net 是 Microsoft 开发的基于 .Net Framework 的框架,两者属于不同的技术栈。
二、MFC 的基本类和对象1. CWinApp 类CWinApp 是 MFC 应用程序的主类,它代表了一个 MFC 应用程序的实例,通常包含了一个主窗口类对象和一些初始化及清理代码。
2. CFrameWnd 类CFrameWnd 是 MFC 中的主窗口类,它代表了应用程序的主窗口,通常包含了菜单、工具栏等 UI 元素。
3. CView 类CView 是MFC 中的视图类,它用于显示窗口中的用户界面,通常包含了子视图、控件等。
com原理与应用
com原理与应用Com原理与应用。
Com(Component Object Model)是微软公司提出的一种面向对象的组件技术,它是一种用于软件组件之间进行通信和交互的机制。
Com原理及其应用已经在Windows操作系统和许多其他软件开发平台上得到了广泛的应用,对于理解Com原理及其应用,以及在实际开发中的应用具有重要的意义。
Com的核心原理是面向对象和接口。
在Com中,每个组件都是一个对象,对象之间通过接口进行通信。
Com组件可以是任何类型的软件,例如动态链接库(DLL)、ActiveX控件、COM+组件等。
Com组件之间的通信是通过接口来实现的,这种接口是一种规范,定义了组件之间的通信协议。
在Com中,每个组件都有一个唯一的标识符,称为CLSID(Class Identifier),用于标识组件的类型。
另外,每个接口也有一个唯一的标识符,称为IID (Interface Identifier),用于标识接口的类型。
通过这些标识符,可以在运行时动态地加载和调用组件。
Com组件的应用范围非常广泛,可以用于开发各种类型的软件,包括桌面应用程序、Web应用程序、服务器端应用程序等。
Com组件可以通过各种开发语言来实现,例如C++、C#、VB等。
在实际开发中,Com组件可以提供各种功能,例如图形界面、数据访问、网络通信、安全控制等。
在使用Com组件时,需要注意一些问题。
首先,Com组件是基于Windows平台的,因此在其他操作系统上可能无法直接使用。
其次,Com组件的开发和部署需要一定的专业知识和经验,需要遵循一定的规范和标准。
最后,Com组件的性能和稳定性也需要进行充分的测试和优化。
总的来说,Com原理及其应用是软件开发中的重要内容,它提供了一种灵活、可扩展、可重用的组件技术,可以大大提高软件开发的效率和质量。
通过深入理解Com原理及其应用,可以更好地应用Com技术来开发各种类型的软件,满足不同的需求。
组件技术课程复习PPT课件
COM跨进程模型
❖ Marshaling基本概念
– 通过marshaling做到客户与服务器之间通信 透明
– proxy/stub的概念
❖ 建立跨进程连接的过程
– marshaling - transport - unmarshaling
❖ marshaling的要点
– 数据类型、数据大小、字节顺序
COM重用模型
❖ 包容和聚合
❖ 只要求对这两种模型的理解,不要求实现
❖ 包容
– 外部对象与内部对象的关系:client/server – 灵活应用,外部对象的接口可以不同于内部对象的
接口
❖ 聚合
– 直接把内部对象的接口暴露给客户 – 理解:内部对象实现两个IUnknown接口,从而维
护外部对象的身份一致性 1 在客户眼里的IUnknown —— 需要委托 2 在外部对象眼里的IUnknown —— 不能委托
Patterns: Iterator
Patterns: Strategy
考试与作业事项
❖ 考试形式
– 闭卷,2小时 – COM部分:重点考对于组件技术的理解 – pattern部分:重点考对于这些patterns的结构的理
解,以及每种模式的要点之处
❖ 考试满分100,占总成绩50% ❖ 三次作业占50%,请考试前交上来
❖ COM中IUnknown接口解决了两个重要的问题
– 动态接口发现,允许对象支持多个接口、允许在运 行时刻确定对象是否支持某些接口
– 生命周期管理
❖ COM接口的内存模型
– vtable,参照:用C语言描述一个COM接口 – COM对象的状态与vtable之间的关系
COM接口与对象(续)
COM 组件设计与应用(十五)——连接点(vc6.0)
COM 组件设计与应用(十五)——连接点(vc6.0)一、前言上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。
二、原理图一、连接点组件原理图。
左侧为客户端,右侧为服务端(组件对象)看着好复杂呀......呵呵,其实简单的紧:(注1)1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。
也就是说可以有多个发生“事件”的源头。
上图就有3个连接点;2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。
连接点容器接口特别简单,因为只有2个函数,一个是 FindConnectionPoint(),表示查找你想要的连接点;另一个是 EnumConnectionPoints(),表示列出所有的连接点,然后你去选择使用哪个。
在实际的应用中,查找法使用最多,占90%,而枚举法使用只占 10%,一般在支持第三方的插件(Plug in)时才使用。
(你想写个 IE 的插件吗?我们后面就要讲到啦)3、每一个连接点,可以被多个客户端的接收器(Sink)连接;这个我们已经熟悉啦,还记得我们在上回书中为了管理多个回调接口,使用了 cookie 的方式进行区别吗?!三、实现组件(一)1、建立一个工作区(WorkSpace)2、在工作区中,建立一个 ATL 工程(Project)。
示例程序中工程名称叫 Simple15,接受全部默认选项。
3、ClassView 中,执行鼠标右键菜单命令 New Atl Object...,添加 ALT 类。
4、左侧分类 Category 选择 Objects,右侧 Objects 选择 SimpleObject(其实就是默认项目)。
5、名称 Name 卡片中,输入组件名称。
示例程序中是 DispConnect。
6、属性 Attributes 卡片中,接口类型选 Dual 双接口。
注意一定要选择 Support Connection Points 来支持连接点。
COMDCOM技术简介
结构化存储
• 结构化存储是一个文件内的文件系统。 可以看成是由存储(Storage)和流构成的层 次树
• 存储对象类似与目录对象 • 流对象类似与文件对象
命名与绑定技术
• Moniker技术允许客户程序通过符号化的 方式访问对象
• 绑定技术使客户可以联接到已经存在的 对象上
• 名字管理与ROT表
COM run time
COM run time
Security provider
RIPnCprocepSsreoscvuidrietyr RPC
Protocol stack LPC Protocol stack
Component
Local
DCOM networkprotocol
Remote
灵活的安全策略
M
HTTP
M
Queued
Client Machine
Server Machine
COM Object
COM核心服务
• Security • Lifecycle Management • Type Information
(Interface Repository) • Monikers (Naming) • Automation (Dynamic
COM/DCOM技术简介
•Component Object Model •Distribute COM
COM
• 组件对象模型,是以组件为发布单元的 对象模型
• 提供组件之间的交互规范,和交互环境
使用COM接口
• 在COM下,对对象的直接访问是不允许 的,与对象的通信是通过定义良好的接 口而进行的
COM对象创建实例
main() { IAS15Demo* pInt; CoInitialize(NULL); CoCreateInstance(CLSID_AS15Demo, NULL, CLSCTX_SERVER, IID_IAS15Demo, &pInt); pInt->DoSomething(); …
基于COM的程序设计原理和应用
双击代码全选1 H RESULT IUnknown::QueryInterface ( REFIID iid, void** ppv );双击代码全选1 2 3 HRESULT hr;IPersistFile* pIPF;hr = pISL->QueryInterface ( IID_IPersistFile, (void**) &pIPF );双击代码全选1 HRESULT CoCreateInstance ( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv );双击代码全选1 2 3 4 5 6 7 8 9 10 11 HRESULT hr_COM;IShellLink* pISL_COM;hr_COM = CoCreateInstance ( CLSID_ShellLink, CLSID NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**) &pISL );if ( SUCCEEDED ( hr_COM ) ){// 用pISL_COM 调用方法}else{// 不能创建COM 对象,hr_COM 为出错代码}双击代码全选1 2 3 4 if ( SUCCEEDED ( hr ) ){pISL_COM->Release();}双击代码全选123456789 10 11 12 13 14 15 16 17 18 19 20 21 22 23WCHAR wszWallpaper [MAX_PATH]; CString strPath; HRESULT hr; IActiveDesktop* pIAD; CoInitialize ( NULL ); hr = CoCreateInstance ( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**) &pIAD ); if ( SUCCEEDED(hr) ) {hr = pIAD->GetWallpaper ( wszWallpaper, MAX_PATH, 0 );if ( SUCCEEDED(hr) ){wcout << L"Wallpaper path is:/n " << wszWallpaper << endl << endl; }else{cout << _T("GetWallpaper() failed.") << endl << endl; } pIAD->Release(); }else{cout << _T("CoCreateInstance() failed.") << endl << endl;}}CoUninitialize();双击代码全选1 2 3 4 5 6 7 8 9 10 11 CString sWallpaper = wszWallpaper;ANSI IShellLink* pISL;IPersistFile* pIPF;CoInitialize ( NULL );hr = CoCreateInstance ( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**) &pISL );if ( SUCCEEDED(hr) ){hr = pISL->SetPath ( sWallpaper );if ( SUCCEEDED(hr) ){1213141516171819 20hr = pISL->QueryInterface ( IID_IPersistFile, (void**) &pIPF );if( SUCCEEDED(hr) ){hr = pIPF->Save ( L"C://wallpaper.lnk", FALSE );pIPF->Release();}}pISL->Release();}CoUninitialize();。
COM 组件设计与应用(十一)—— IDispatch 及双接口的调用
COM 组件设计与应用(十一)—— IDispatch 及双接口的调用一、前言前段时间,由于工作比较忙,没有能及时地写作。
其间收到了很多网友的来信询问和鼓励,在此一并表示感谢。
咳......我也需要工作来养家糊口呀......上回书介绍了两种方法来写自动化(IDispatch)接口的组件程序,一是用MFC 方式编写“纯粹”的 IDispatch 接口;二是用 ATL 方式编写“双接口”的组件。
二、IDispatch 接口和双接口使用者要想调用普通的 COM 组件功能,必须要加载这个组件的类型库(Type library)文件tlb(比如在 VC 中使用 #import)。
然而,在脚本程序中,由于脚本是被解释执行的,所以无法使用加载类型库的方式进行预编译。
那么脚本解释器如何使用 COM 组件那?这就是自动化(IDispatch)组件大显身手的地方了。
IDispatch 接口需要实现4个函数,调用者只通过这4个函数,pVarResult,[out] EXCEPINFO * pExcepInfo,[out] UINT * puArgErr) .... } 其实,就是根据序号进行分支调用啦。
(注3)行效率是比较低的。
ATL 从效率出发,实现了一种叫“双接口(dual)”的接口模式。
下面我们来看看,到底什么是双接口:图一、双接口(dual) 结构示意图从上图中可以看出,所谓双接口,其实是在一个 VTAB 的虚函数表中容纳了三个接口(因为任何接口都是从 IUnknown 派生的,所以就不强调 IUnknown 了,叫做双接口)。
我们如果从任意一个接口中调用 QueryInterface()得到另外的接口指针的话,其实,得到的指针地址都是同使用方式 因为 所以脚本语言使用组件 解释器只认识 IDispatch 接口 可以调用,但执行效率最低编译型语言使用组件 它认识 IDispatch 接口 可以调用,执行效率比较低编译型语言使用组件 它装载类型库后,就认识了 Ixxx 接口可以直接调用 Ixxx 函数,效率最高啦 结论 双接口,既满足脚本语言的使用方便性,又满足编译型语言的使用高效性。
WTL介绍——精选推荐
WTL介绍WTL简单介绍关键词:WTL是⼀个好东东.它开发的程序都很短⼩精悍.对开发WIN32的应⽤有很好的优点.它不⽤MFC开发.但可以⾼速产⽣窗体和控件. WTL简单介绍vcmfc在ATL出现的时候,⼀些部分COM的编程⼈员開始认为开发COM运⽤是⼀种快乐,由于使⽤它⾮常⽅便地开发⼩规模的COM组件,但好景不长,现实的COM组件是包罗相当⼴泛的,特别当它们准备使⽤包装我窗体控件,发现ATL提供了相当的稀少。
因此Microsoft推出了半成品与没有技术⽀持的WTL,这也是WTL诞⽣的原因。
⾮常多初次接触WTL都问“WTL这三个字母代表什么呢?”:WTL全称为Windows Template Library,构架于ATL之上,採⽤C++模板技术来包装⼤部窗体控制,并给出⼀个与MFC类似的应⽤框架。
他们紧跟着问“那我怎样得到它呢?”:因为WTL是Microsoft推出的,在Microsoft的PlatForm SDK中就有,下⾯是部分画⾯:跟着问题⼜来了,“我该怎样使⽤它们呢?”:在你安装完了WTL SDK之后,在安装⽂件夹中有⼀个AtlApp60.Awx的向导⽂件,将它复制到你安装Visual C++的⽂件夹:Microsoft Visual Studio//common//mesdev98//bin//ide//⽂件夹下(实在不⾏使⽤Windows的搜索⽂件查找.awx),这是,在VC的应⽤程序向导⾥就有跟MFC类似的WTL应⽤程序向导。
假设你是MFC的使⽤者,你可能会再问“WTL与MFC在包装窗体控制有哪些不同呢?”:我仅仅能⽤下⾯表格回答你:Stand-alone library Yes No (built on ATL)AppWizard support Yes YesClazard support Yes NoOfficially supported by Microsoft Yes No (Supported by volunteersinside MS)Support for OLEDocumentsYes No Support for Views Yes YesSupport forDocumentsYes NoBasic Win32 &Common ControlWrappersYes YesAdvanced CommonControl Wrappers(Flat scrollbar, IPAddress, PagerControl, etc.)No YesCommand Bar support (including bitmapped context menus)No (MFC doesprovide dialog bars)YesCString Yes Yes GDI wrappers Yes Yes Helper classes(CRect, Cpoint, etc.)Yes YesPropertySheets/WizardsYes YesSheets/WizardsSDI, MDI support Yes YesMulti-SDI support No YesMRU Support Yes YesDockingWindows/BarsYes NoSplitters Yes YesDDX Yes Yes (not as extensive as MFC) Printing/Print Preview Yes YesScrollable Views Yes YesCustom Draw/OwnerDraw WrapperNo YesMessage/CommandRoutingYes YesCommon Dialogs Yes YesHTML Views Yes YesSingle InstanceApplicationsNo NoUI Updating Yes YesTemplate-based No YesSize of a statically linked do-nothing SDI application with toolbar, status bar, and menu 228KB +MSVCRT.DLL(288KB)24k (with /OPT:NOWIN98)(+ MSVCRT.DLL if you useCString)Size of a dynamically linked do-nothing SDI application with toolbar, status bar, and menu 24KB +MFC42.DLL (972KB)+MSVCRT.DLL(288KB)N/ARuntime Dependencies CRT (+ MFC42.DLL,if dynamically linked)None (CRT if you use CString)最后再说两句。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• offsetof宏:成员类与父类之间的偏移值
接口映射表的宏定义
接口映射表定义
BEGIN_INTERFACE_MAP(CDictionary, CCmdTarget) INTERFACE_PART(CDictionary, IID_IDictionary, Dictionary) INTERFACE_PART(CDictionary, IID_ISpellCheck, SpellCheck) END_INTERFACE_MAP()
“用嵌套类实现COM接口”原理
CDictionary
m_dictionaryObj
Vtable for IDictionary
vptr
QueryInterface AddRef Release ……
m_spellCheckObj vptr m_pData m_DictFilename[128] m_Ref m_nWordNumber m_nStructNumber
口ID以及接口vtable与父类this指针之间的偏移量
DECLARE_INTERFACE_MAP
#define DECLARE_INTERFACE_MAP() \ private: \ static const AFX_INTERFACEMAP_ENTRY _interfaceEntries[]; \ protected: \ static AFX_DATA const AFX_INTERFACEMAP interfaceMap; \ static const AFX_INTERFACEMAP* PASCAL _GetBaseInterfaceMap(); \ virtual const AFX_INTERFACEMAP* GetInterfaceMap() const; \ struct AFX_INTERFACEMAP_ENTRY { const void* piid; size_t nOffset; }; struct AFX_INTERFACEMAP { #ifdef _AFXDLL c o ns t A FX _ IN TE RF AC E MA P* ( PA SC A L pfnGetBaseMap)(); #else const AFX_INTERFACEMAP* pBaseMap; #endif const AFX_INTERFACEMAP_ENTRY* pEntry; };
MFC库结构
CObject 应用类结构 CCmdTarget 窗口支持 CWnd 文档类 异常类 文件服务类 数组类 列表类 映射类 Internet 类 对话框类 视类 控制类 图形设备环境类 控制支持类 图形对象类 菜单类 ODBC 支持类 DAO 支持类 同步类 Windows 套接字类 其它类: Internet 支持类 运行时刻对象支持 简单值类型 结构 其它支持类 集合模板类 自动化类型 用于同步的类
MFC对COM应用的支持
框架窗口类 控制条类 属性页表类
2
用嵌套类实现COM接口
class CDictionary { …… //构造函数和析构函数 HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj); ULONG __stdcall AddRef(); ULONG __stdcall Release(); class XDictionaryObj : public IDictionary { public: CDictionary * m_pParent; virtual HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj); virtual ULONG __stdcall AddRef(); virtual ULONG __stdcall Release(); virtual BOOL __stdcall Initialize(); …... virtual void __stdcall FreeLibrary(); } m_dictionaryObj;
用嵌套类实现COM接口(续一)
续
class XSpellCheckObj : public ISpellCheck { public: CDictionary * m_pParent; virtual HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj); virtual ULONG __stdcall AddRef(); virtual ULONG __stdcall Release(); virtual BOOL __stdcall CheckWord (String word, String *); } m_spellCheckObj; private : struct char int int };
VC提供的用于描述接口的宏
与 COM 接口有关的一些宏的说明 宏 DECLARE_INTERFACE(iface) DECLARE_INTERFACE_( iface, baseiface) STDMETHOD(method) STDMETHOD_(type,method) 说明 声明接口 iface,它不从其它的接口派生。 声明接口 iface,它从接口 baseiface 派生。 声明接口成员函数 method,函数返回类型为 HRESULT。 声明接口成员函数 method,函数返回类型为 type。
用嵌套类实现COM接口(续三)
HRESULT CDictionary::QueryInterface(const IID& iid, void **ppvObj) { if (iid == IID_IUnknown || iid == IID_Dictionary) { *ppvObj = &m_dictionaryObj; AddRef(); return S_OK; } else if (iid == IID_SpellCheck) { *ppvObj = &m_spellCheckObj; AddRef(); return S_OK; } *ppv = NULL; return E_NOINTERFACE ; }
1
MFC基础
• 应用类
– – – – – – AfxGetApp CWinApp::InitInstance CWinApp::ExitInstance CWinApp::OnIdle CWinApp::Run CWnd *m_pMainWnd
MFC的消息处理机制 ——消息映射表
• 在CWnd派生类定义中加入声明:
DECLARE_MESSAGE_MAP()
• 在类的实现文件中加入表和表项的定义:
BEGIN_MESSAGE_MAP(theClass, baseClass) ...... END_MESSAGE_MAP
• 窗口类
– AfxGetMainWnd
消息映射表示例
BEGIN_MESSAGE_MAP(theClass, baseClass) //{{AFX_MSG_MAP(theClass) ON_WM_SETFOCUS() ON_WM_CREATE() ON_WM_DESTROY() ON_WM_CLOSE() ON_WM_SIZE() ON_MESSAGE(WM_COMMANDHELP, OnCommandHelp) ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest) ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, OnUpdateControlBarMenu) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) //}}AFX_MSG_MAP END_MESSAGE_MAP
Win32 SDK对COM的支持
• Win32 SDK包括COM库函数的支持
Win32 SDK 提供的一些头文件的说明 头文件 Unknwn.h Wtypes.h Objidl.h Comdef.h ObjBase.h Ole2.h 说明 标准接口 IUnknown 和 IClassFactory 的 IID 及接口成员函数的定义。 包含了 COM 使用的数据结构的说明。 所有标准接口的定义, 既可用于 C 语言风格的定义, 也可用于 C++语言风格 的定义。 所有标准接口以及 COM 和 OLE 内部对象的 CLSID。 所有的 COM API 函数的说明。 所有经过封装的 OLE 辅助函数。
Vtable for ISpellCheck
QueryInterface AddRef Release ……
CDictionary的非虚函数
QueryInterface AddRef Release …….
3
MFC:接口映射表
• CCmdTarget类 • CCmdTarget::m_dwRef为引用计数 • 接口映射表与消息映射表非常类似 • 接口映射表:记录了CCmdTarget类中每一个嵌套类的接
DictWord *m_pData; *m_DictFilename[128]; m_Ref ; m_nWordNumber, m_nStructNumber;
未完
用嵌套类实现COM接口(续二)
CDictionary::CDictionary() { ....... // Initializtion m_dictionaryObj. m_pParent = this; m_spellCheckObj. m_pParent = this; }
MFC应用类型
• 常规应用:MDI应用、SDI应用、基于对话框程序 • DLL应用:静态连接MFC库的正规DLL、动态连接
MFC库的正规DLL、MFC扩展DLL
• 其他应用:
– – – – 支持OLE服务或者包容器的SDI应用 支持OLE服务或者包容器的MDI应用 支持自动化(Automation)服务的SDI或者MDI程序 ActiveX控制应用(OCX应用)