com原理及代码实例

上传人:第*** 文档编号:34610306 上传时间:2018-02-26 格式:DOC 页数:15 大小:312.50KB
返回 下载 相关 举报
com原理及代码实例_第1页
第1页 / 共15页
com原理及代码实例_第2页
第2页 / 共15页
com原理及代码实例_第3页
第3页 / 共15页
com原理及代码实例_第4页
第4页 / 共15页
com原理及代码实例_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《com原理及代码实例》由会员分享,可在线阅读,更多相关《com原理及代码实例(15页珍藏版)》请在金锄头文库上搜索。

1、1. COM 原理1.1. COM 基本概念介绍1.什么是 COM(Component Object Modal)COM(Component Object Modal)是 Microsoft 组件对象模型的简称。是一个说明如何建立可动态交替更新组件的规范。简单地说,COM 是一种跨应用和语言共享二进制代码的方法。与 C+不同,它提倡源代码重用。ATL 便是一个很好的例证。源码级重用虽然好,但只能用于 C+。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。2 .COM 组件COM 组件是由以 Win32 动态链接库(DLL)或可执行文件(EXE)发布的代码所组成。3为什

2、么要学习 COM传统的软件开发模式:传统的软件应用程序发布以后,使用者想得到更完善的软件或者去掉其中的某些内容,只有等软件提供商发布新的版本以后,使用者的这一梦想才能得以实现。使用 COM 组件以后:软件开发人员可以在软件版本发布以后修改或者去掉软件某个不需要部分。也及应用程序在更高的层次上定制,使得软件更具灵活性、动态性。是未来应用软件开发的趋势。4 COM 的前身是 OLE(Object Linking and Embedding)对象链接与嵌入。5组件:如积木一样,具有“块”的概念,可以动态的将他们插入或卸出应用程序。这就需要两个条件:第一,组件必须动态链接(不因自己的位置改变而改变自身

3、形式) ;第二,组件必须隐藏内部实现细节(独立与具体编程语言,二进制形式发布) 。每个组件相当于一个黑盒子,对外提供的只是接口(函数) 。如果接口没有发生任何变化时,对组件的修改几乎不会影响应用程序的其它部分。提供服务的组件称为服务器组件,使用服务的组件称为客户组件。1.2. 完整的 COM 组件的接口实现实例#include #include using namespace std;void trace(const char * pMsg)coutFx1();pintex-Fx2();InteY *pintey = pcompa;trace(客户:使用组件 InteY 接口。);pintey

4、-Fy1();pintey-Fy2();trace(客户:删除组件。);delete pcompa;return 0;增加查询组件接口 QueryInterface(),应用计数增加 AddRef(),应用技术减少 Release()的完整例子。#include #include using namespace std;void trace(const char * pMsg)cout(this);else if(iid = IID_InteX)trace(CompA():QueryInterface:返回指向 InteX 的指针.);*ppv = static_cast(this);else

5、 if(iid = IID_InteY)trace(CompA():QueryInterface:返回指向 InteY 的指针.);*ppv = static_cast(this);elsetrace(CompA():QueryInterface:接口不支持.);*ppv = NULL;return E_NOINTERFACE;reinterpret_cast(*ppv)-AddRef();return S_OK;ULONG STDMETHODCALLTYPE CompA:AddRef()cout(new CompA);pinte-AddRef();return pinte;/ IIDscon

6、st IID IID_InteX =0x32bb832c,0xb41a,0x11cf,0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82;const IID IID_InteY =0x32bb832d,0xb41a,0x11cf,0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82;const IID IID_InteZ =0x32bb832e,0xb41a,0x11cf,0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82;/ 客户程序int main()HRESULT hr;trace(客户:获得 IUnknown

7、的一个指针);IUnknown *piunknown = CreateInstance();trace(客户:获得 InteX 的接口);InteX *pintex = NULL;hr = piunknown-QueryInterface(IID_InteX,(void *)if(SUCCEEDED(hr)trace(客户成功获得组件 InteX);pintex-Fx();pintex-Release();trace(客户:获得 InteY 的接口);InteY *pintey = NULL;hr = piunknown-QueryInterface(IID_InteY,(void *)if(

8、SUCCEEDED(hr)trace(客户成功获得组件 InteY);pintey-Fy();pintey-Release();trace(客户尝试获得不支持的 InteZ 组件接口);InteZ *pintez= NULL;hr = piunknown-QueryInterface(IID_InteZ,(void *)if(SUCCEEDED(hr)trace(客户成功获得组件 InteZ);pintez-Fz();pintez-Release();elsetrace(客户不能成功获得组件 InteZ);trace(客户释放 IUnknown 借口);piunknown-Release();

9、return 0;1.3. ATL活动模板库(The Active Template Library)在 ATL 产 生 以 前, 开 发 COM 组 件 的 方 法 主 要 有 两 种: 一 是 使 用 COM SDK 直 接 开 发 COM 组 件, 另 一 种 方 式 是 通 过 MFC 提 供 的COM 支 持 来 实 现。使 用 ATL 开 发 COM 应 用 是 一 件 非 常 简 单 的 事 情,但 是 在 ATL 简 单 易 用 的 界 面 后 面 却 包 含 着 复 杂 的 技 术。这些技术包含以下一些方面: COM 技 术 C+ 模 板 类 技 术(Template) C+

10、 多 继 承 技 术(Multi-Inheritance) 其中,COM 技术本文开头有所描述。C+ 模 板 类 技 术(Template)、C+ 多 继 承 技 术(Multi-Inheritance)在 C+理论课中已有详尽描述。这里最主要的是介绍使用 ATL怎么生成一个自己的 COM 组件以及怎么使用该组件。1建立一个 ATL 工程:图 11- 12选择创建的 COM 类型:图 11- 2该步骤中的一些选项说明:动 态 连 接 库(Dynamic Linking Library) 最 终 产 生 一 个 动 态 连 接 库(DLL) 形 式 的 COM 服 务 程 序;应 用 程 序(E

11、xecutable application ) 最 终 产 生 一 个 可 执 行 程 序 类 型(EXE) 的 COM 服 务 程 序;NT 服 务(NT Service) 产 生 一 个 以 NT 服 务 方 式 运 行 的 COM 服 务 程 序。允 许 嵌 入 Proxy/Stub 代 码。 由 Microsoft 提 供 的 MIDL 编 译 IDL 文 件 以 后, 将 产 生 用 于 对 象 调 度(Marshaling) 的 Proxy/Stub 的 代 码。 在 传 统 方 式 下, 这 部 分 代 码 与 COM 服 务 程 序 的 代 码 是 分 离 的, 但 是 由 于

12、 新 的 COM 标 准 支 持 多 线 程 环 境 下 的 COM 对 象 服 务, 因 此 在 动 态 连 接 库 的 COM 服 务 程 序 中 也 要 有 Proxy/Stub 的 支 持。 为 了 支 持 在 网 络 上 的 传 输,ATL 允 许 用 户 选 择 将 Proxy/Stub 的 代 码 包 括 在 生 成 的 DLL 代 码 中。 这 个 选 项 在 EXE 和 NT 服 务 类 型 的 COM 应 用 条 件 下 不 可 选。 允 许 支 持 MFC。 由 于 ATL 对 除 COM 以 外 的 基 本 的 Windows 编 程 方 面 的 支 持 极 为 有 限

13、, 同 时 许 多 程 序 员 对 MFC 又 非 常 熟 悉, 因 此 在 ATL 的 工 程 设 置 中 允 许 在 ATL 工 程 内 部 支 持 使 用 MFC, 即 可 以 使 用 MFC 定 义 的 类。 这 一 特 点 给 开 发 人 员 提 供 了 许 多 方 便, 特 别 对 于 习 惯 使 用 MFC 的 人 来 说, 能 够 使 用 MFC 提 供 的 各 种 功 能 强 大 的 类 的 支 持, 而 不 必 直 接 使 用 Windows SDK。 从 另 一 个 方 面 来 看, 在 ATL 工 程 中 使 用 MFC 同 时 就 丧 失 了 ATL 代 码 轻 量

14、级 的 特 点。 支 持 MTS。MTS 是 Microsoft Transaction Server 的 缩 写, 它 是 Microsoft 在COM 技 术 方 面 的 一 个 新 的 分 支, 这 里 不 做 详 细 说 明。- 完 成 上 面 的 设 置 以 后, 可 以 选 择 Finish 完 成 工 程 的 设 置,ATL 将 创 建 相 应 的 工 程。 3向 工 程 中 加 入 一 个 新 的 ATL 类:首 先 通 过 集 成 环 境 的Insert 菜 单 下 的New ATL Object. 命 令 进 入ATL Object Wizard 对 话 框。如下图所示:图

15、 11- 3对 话 框 的 左 边 部 分 说 明 了 待 创 建 对 象 的 基 本 类 型, 这 里 主 要 有 以 下 几 种 类 型: 对 象(Object) 基 本 的 COM 对 象 类 型; 控 制(Control) ActiveX Control 类 型 的 ATL 对 象; 其 他(Miscellaneous) 辅 助 功 能, 如 对 话 框 的 生 成 等; 数 据 访 问(Data Access) 数 据 访 问, 支 持 MTS 等。对于一般的 COM 服 务 程 序,选择 对 象(Object) ,点击下一步继续:3输入引入的类名:图 11- 44切换到 Attri

16、butes(属性)标签页:图 11- 5对 象 的 属 性 设 置 是 ATL 对 象 创 建 过 程 中 最 复 杂 的 部 分, 包 括 以 下 几 个 主 要 部 分: 对 象 的 线 程 模 型(Thread Model) :对 象 的 线 程 模 型 是 COM 对 象 在 多 线 程 环 境 下 被 访 问 时 对 访 问 方 式 的 控 制, 缺 省 情 况 下 在 ATL 中 采 用 的 是 套 间 模 型 Apartment, 由 系 统 通 过 消 息 队 列 方 式 提 供 并 发 控 制。 对 象 的 接 口 模 型(Interface):COM 对 象 的 接 口 可 以 是 双 接 口(Dual Interf

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号