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组件。
- 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应用)