`
yesjavame
  • 浏览: 689557 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

吕 思 伟 ---- 潘 爱 民 :: ATL 介 绍( 二 )

阅读更多

ATL 介 绍( 二 ) 吕 思 伟--潘 爱 民


---- ( 接 上 期)

---- 在C++ 语 言 中 模 板 类 的 定 义 格 式 如 下:

template < class T >
class MyTemp
{
      MyTemp< T >( ) { };
      ~MyTemp< T >( ) { };
     int MyFunc( int a) ;
}
 … …
Int MyTemp< T >::MyFunc( int a)
{
}

---- 首 先 使 用C++ 的 关 键 字“template” 来 声 明 一 个 模 板 类 的 定 义。 在 关 键 字 后 面 是 用 尖 括 号 括 起 来 的 类 型 参 数。 正 是 根 据 这 个 类 型 参 数, 编 译 器 才 能 在 编 译 过 程 中 将 模 板 类 的 具 体 定 义 转 化 为 一 个 实 际 的 类 的 定 义, 即 生 成 一 个 新 类。 接 下 来 的 定 义 方 式 与 普 通 的 类 定 义 十 分 相 似, 只 是 在 类 的 函 数 定 义 中 都 要 带 有 类 型 参 数 的 说 明。

---- 下 面 的 程 序 段 说 明 了 模 板 类 的 用 法:

typedef MyTemp< MyClass > myclassfromtemp;
myclassfromtemp m;
int a = m.Myfunc(10);

---- 通 常 在 使 用 模 板 类 时 为 了 方 便 起 见, 使 用 一 个 关 键 字“typedef” 为 新 定 义 出 来 的 类 取 一 个 名 字。 在 上 面 的 程 序 段 中 假 设“MyClass” 是 一 个 由 用 户 定 义 的 类, 通 过 将 这 个 类 的 名 字 作 为 类 型 参 数 传 递 给 模 板 类, 我 们 可 以 创 建 一 个 新 的 类, 这 个 类 的 行 为 将 以 模 板 类 的 定 义 为 基 础, 例 如 它 具 有 模 板 类 定 义 的 所 有 成 员 函 数, 同 时 这 个 类 又 是 对 模 板 类 行 为 的 一 种 修 改, 这 种 修 改 是 通 过 用 户 提 供 的 类 型 参 数 来 实 现 的。 赋 予 模 板 类 以 不 同 的 类 型 参 数, 则 得 到 行 为 框 架 相 似 但 具 体 行 为 不 同 的 一 组 类 的 集 合。 有 了 新 的 类 的 定 义 以 后, 我 们 可 以 像 使 用 普 通 类 一 样 来 创 建 一 个 类 的 实 例, 即 一 个 新 的 对 象, 并 且 调 用 这 个 对 象 的 成 员 函 数。

---- 模 板 类 是 对 标 准C++ 语 言 的 最 新 扩 展, 虽 然 它 的 功 能 很 强 大, 但 是 要 想 使 用 好 模 板 类 需 要 相 当 多 的 关 于 语 言 和 编 程 的 经 验 和 知 识, 而 且 错 误 地 使 用 模 板 类 又 会 对 程 序 的 结 构 和 运 行 效 率 带 来 很 大 的 副 作 用, 因 此 一 般 的 编 程 环 境 和 编 程 书 籍 对 模 板 类 的 使 用 都 采 取 谨 慎 的 态 度。 而ATL 的 核 心 就 是 由 几 十 个 模 板 类 构 成 的, 通 过 研 究ATL 的 源 代 码 可 以 使 我 们 对 模 板 类 的 使 用 有 比 较 全 面 的 认 识。

---- 多 继 承 技 术 同 模 板 一 样, 是C++ 语 言 中 极 具 争 议 性 的 技 术。 使 用 多 继 承 技 术 可 以 使 程 序 的 设 计 和 实 现 更 加 灵 活, 但 是, 由 于 多 继 承 的 复 杂 性 和 自 身 概 念 上 的 一 些 问 题, 使 多 继 承 在 各 种 面 向 对 象 的 语 言 环 境 中 得 到 的 支 持 都 非 常 有 限。 例 如Small Talk 根 本 就 不 允 许 多 继 承, 同 样MFC 也 不 支 持 多 继 承 技 术。

---- 多 继 承 最 大 的 问 题 是 所 谓 的“ 钻 石 结 构”。 例 如 下 面 的 代 码:

class A
{
    ......
};
class B : public A
{ 
   ......
};
class C : public A
{
   ......
};
class D : public C,B
{
   ......
}

---- 由 于 类D 同 时 从 类C 和 类B 继 承, 因 此 在 下 面 的 语 句 中 就 会 发 生 歧 义:

D* pD = new D;
(A*)pD- >Func(...);

---- 由 于 类D 通 过 类C 和 类B 分 别 继 承 了 类A, 这 里 的 强 制 转 化 就 会 发 生 歧 义。

---- ATL 使 用 了C++ 最 新 规 范 中 加 入 的 两 个 运 算 符 号 static_cast、dynamic_cast 代 替 简 单 的 强 制 转 化, 从 而 消 除 多 继 承 带 来 的 歧 义。 使 用 这 两 个 运 算 符 号, 我 们 可 以 在 对 象 运 行 过 程 中 获 取 对 象 的 类 型 信 息。 上 面 的 代 码 可 以 采 用 下 面 的 方 式 修 改:

D* pD = new D;
static_cast< A* >(static_cast< B* >(pD))- >Func(...);

---- 为 什 么 模 板 类 和 多 继 承 技 术 会 成 为ATL 主 要 的 工 具 呢 ? 原 因 在 于, 采 用 模 板 可 以 在 编 译 过 程 中 快 速 生 成 具 有 用 户 定 制 功 能 的 类, 这 对 于COM 这 样 一 个 复 杂 的 技 术 体 系 在 实 现 效 率 上 得 到 了 很 大 的 提 高。 通 过 使 用 模 板 类, 用 户 可 以 把 精 力 集 中 在 自 己 开 发 的 类 的 基 本 逻 辑 上, 在 完 成 了 自 己 的 类 的 设 计 以 后, 通 过 继 承 不 同 的 类, 生 成 不 同 的 模 板 类, 就 可 以 快 速 实 现COM 的 功 能, 同 时 又 避 免 了 采 用 单 继 承 结 构 造 成 的 大 量 功 能 冗 余。

---- 总 之, 正 是 由 于 在 设 计 实 现 过 程 中 采 用 了 模 板 类 和 多 继 承 技 术, 才 使ATL 成 为 一 个 小 巧 灵 活 的COM 开 发 工 具, 能 够 适 应 开 发 人 员 对COM 应 用 开 发 的 各 种 需 要。

三、ATL 基 本 使 用

---- 这 一 部 分 将 重 点 介 绍ATL 的 基 本 使 用 过 程。 由 于ATL 已 经 被 集 成 在Microsoft Visual Studio 的Visual C++ 开 发 环 境 中, 因 此 要 使 用ATL 必 须 先 安 装Visual C++。 在 下 面 的 讨 论 中 有 关COM 的 基 本 知 识 请 参 阅 有 关 的 文 档, 这 里 不 再 详 细 说 明。 给 出 的 图 是 在Microsoft Windows 98 平 台 下Visual Studio 6.0 的 使 用 示 意 图。

---- 使 用ATL 开 发 一 个COM 应 用 基 本 可 以 分 为 以 下 几 个 步 骤:

  1. 创 建 一 个 新 的ATL 工 程, 并 对 工 程 的 选 项 进 行 适 当 的 配 置。
  2. 向 新 创 建 的 工 程 添 加 新 的ATL 类, 并 对 该 类 进 行 一 些 初 始 配 置 工 作。
  3. 根 据COM 应 用 的 基 本 要 求 向 新 的ATL 类 加 入 新 的 接 口 定 义, 并 实 现 相 应 的 接 口 成 员 函 数。
  4. 编 译 连 接 工 程, 注 册COM 应 用。

下 面 将 根 据 这 些 步 骤 依 次 介 绍ATL 的 基 本 使 用 过 程。

---- 1. 创 建 工 程

---- 首 先 启 动Visual C++ 集 成 开 发 环 境, 选 择“File” 菜 单 下 的“New...” 命 令, 在“New” 对 话 框 中 选 择“Project” 页, 如 图1 所 示。


图1 创 建 新 工 程 界 面 示 意 图

---- 选 择“ATL COM AppWizard” 项, 这 是 创 建ATL 工 程 的AppWizard 向 导 入 口。 然 后 在“Project name” 编 辑 框 中 输 入 工 程 的 名 字, 单 击“OK” 按 钮, 进 入AppWizard 对 话 框。 如 图2 所 示。


图2 ATL COM AppWizard 对 话 框 示 意 图

---- 在AppWizard 对 话 框 中 主 要 的 设 置 选 项 有:

---- ■ COM 服 务 程 序 的 类 型:

---- 动 态 连 接 库(Dynamic Linking Library) 最 终 产 生 一 个 动 态 连 接 库(DLL) 形 式 的COM 服 务 程 序;

---- 应 用 程 序(Executable application) 最 终 产 生 一 个 可 执 行 程 序 类 型(EXE) 的COM 服 务 程 序;

---- NT 服 务(NT Service) 产 生 一 个 以NT 服 务 方 式 运 行 的COM 服 务 程 序。

---- ■ 允 许 嵌 入Proxy/Stub 代 码。 由Microsoft 提 供 的MIDL 编 译IDL 文 件 以 后, 将 产 生 用 于 对 象 调 度(Marshaling) 的Proxy/Stub 的 代 码。 在 传 统 方 式 下, 这 部 分 代 码 与COM 服 务 程 序 的 代 码 是 分 离 的, 但 是 由 于 新 的COM 标 准 支 持 多 线 程 环 境 下 的COM 对 象 服 务, 因 此 在 动 态 连 接 库 的COM 服 务 程 序 中 也 要 有Proxy/Stub 的 支 持。 为 了 支 持 在 网 络 上 的 传 输,ATL 允 许 用 户 选 择 将Proxy/Stub 的 代 码 包 括 在 生 成 的DLL 代 码 中。 这 个 选 项 在EXE 和NT 服 务 类 型 的COM 应 用 条 件 下 不 可 选。 ◎( 未 完 待 续)

分享到:
评论

相关推荐

    Atl---ian-Atl---ian数据中心终极指南-2020.12-26页精品报告2020.pdf

    根据提供的文件信息,这份《Atl---ian-Atl---ian数据中心终极指南-2020.12-26页精品报告2020.pdf》是关于Atl---ian公司提供的企业级数据中心解决方案的详细报告。报告内容涵盖了产品介绍、迁移指南、升级指导、功能...

    ATL开发指南---PDF

    这个“ATL开发指南”是一份专为C++开发者设计的中文参考资料,旨在帮助他们深入理解和高效利用ATL进行软件开发。下面我们将详细探讨ATL的核心概念、主要功能以及如何使用ATL来构建COM组件。 ATL的核心概念: 1. **...

    Keetano-ATL-MyGangsta

    【Keetano-ATL-MyGangsta】是一个与字体设计相关的项目,可能是由设计师或团队Keetano创建的一款独特字体。ATL可能代表"Atlanta",这可能表明该字体设计受到了亚特兰大城市文化的影响,或者它可能是设计师自创的缩写...

    icesat2-atl03-atbd-r005-0.pdf ATL03算法文档

    《ICESat-2全球定位光子算法文档ATL03》是NASA的冰、云和陆地高程卫星-2(ICESat-2)项目的一个关键理论基础文档,旨在详细阐述ATL03数据产品的生成原理和技术细节。该文档由NASA的科学家们共同准备,涉及了测绘、...

    ICESAT-2 +ATL03 + ATL08

    **ICESAT-2 + ATL03 + ATL08 知识点详解** ICESAT-2(Ice, Cloud, and land Elevation Satellite-2)是美国国家航空航天局(NASA)发射的一颗卫星,主要任务是通过激光雷达(Lidar)技术测量全球冰层、森林和地形的...

    net-atl1e-1.0.1.14-1.x86_64.vib

    ESXI 6.0 INTER 网卡驱动程序,net-atl1e-1.0.1.14-1.x86_64.vib,有需要的朋友可以参考一下,需要第三方软件写,只适合6.0,不适合6.5

    ATL开发指南 ------

    本指南旨在为开发者提供深入理解ATL的知识,帮助他们有效地利用此技术进行Windows平台上的程序设计。 ATL的核心设计理念是简洁和高效。它通过C++模板技术实现了对COM接口的最小化实现,减少了不必要的内存开销,...

    VC-ATL-COM-.rar_ATL com _com atl_vc ATL COM_vc atl

    在VC++中,可以使用ATL Project Wizard来生成ATL项目,选择适当的项目类型(如控制台、DLL或exe),然后添加你需要的接口和类。 ATL还支持 ATL Simple Objects,这是一种快速创建简单COM对象的方法,适用于只需要一...

    ATL入门核心资料

    本资料集合了ATL的入门级知识点,旨在帮助开发者快速理解和上手ATL技术。 1. ATL基础知识: - ATL的设计理念:ATL的目标是简化COM编程,通过模板和宏来减少代码量,提高开发效率。 - ATL与MFC(Microsoft ...

    ATL 技术内幕 ATL技术内幕

    在深入探讨ATL技术内幕之前,我们先来理解一下ATL的基本概念。 ATL的核心在于模板类和宏,这些模板类和宏简化了COM对象的实现,使得开发者能够快速创建接口、事件处理程序和自动化服务器。ATL通过提供诸如...

    ATL编程书籍-学习ATL的初学者必备。

    这本书籍对于想要深入理解ATL技术的初学者来说是一份宝贵的资源。ATL是C++编程中一个重要的工具,尤其在构建轻量级、高性能的COM对象时,它的优势尤为突出。 ATL编程的核心概念主要围绕以下几个方面: 1. **COM...

    VC-ATL-服务开发示例

    本项目"VC-ATL-服务开发示例"正是基于VC++和ATL技术,展示了如何创建和管理Windows系统服务。 在Windows系统服务开发中,我们需要了解以下几个核心概念: 1. **服务控制管理器(Service Control Manager, SCM)**...

    Virsua C++的ATL高级应用

    本资料《Virsua C++的ATL高级应用》详细探讨了ATL在实际开发中的高级技巧和应用。 1. ATL基础 - COM对象:ATL是基于COM的,理解COM的基本概念,如接口、IUnknown、QueryInterface、AddRef和Release等,是学习ATL的...

    ATL-COM-Shell扩展编程

    ATL-COM-Shell扩展编程是一门深入探讨Windows操作系统中Shell扩展、Active Template Library (ATL)以及Component Object Model (COM)技术的综合教程。这三个关键知识点构成了Windows系统级编程的重要组成部分,尤其...

    ATL---IAN-IT服务管理的未来在于敏捷 - ITIL 4 和 Atl---ian 实用指南-2020.6-35页精品报告2020.pdf

    这份名为“ATL---IAN-IT服务管理的未来在于敏捷 - ITIL 4 和 Atl---ian 实用指南”的报告深入探讨了ITIL 4框架与Atlassian解决方案相结合的实践方法,以及如何利用它们提升IT团队的敏捷性和业务价值创造能力。...

    python实现ICESat-2 ATL08转shapefile

    python实现ICESat-2 ATL08转shapefile

    ATL.rar_ATL_ATL 界面_ATL 容器

    ATL容器包括如ATL::CArray、ATL::CMap、ATL::CList和ATL::CHeapPtr等,它们是高效且轻量级的替代标准模板库(STL)中的容器。这些容器在设计时考虑了COM组件的性能需求,因此在内存管理、线程安全和接口实现等方面具有...

    ATL开发指南代码

    在"ATL开发指南"这本书中,作者深入浅出地讲解了ATL的原理和使用方法,包括基础概念、对象模型、接口实现、事件处理、服务器和控件的创建等。随书附带的代码通常包含了大量的示例和实践项目,以便读者能够更好地理解...

    atl03-v006-ICESat-2天文台利用光计数激光雷达使用手册.pdf

    更高级别的ATLAS/ICESat-2数据产品(ATL 03及以上)由地面轨道组织,地面轨道1 L和1 R形成对一,地面轨道2L和2 R形成对二,地面轨道3L和3R形成对三。每对还有一对轨道-左右梁实际位置之间的假想线(见图1)。成对...

    ATL源码学习-Tear-Off接口支持(代码)

    ATL中的Tear-off接口实现主要是通过`IUnknown`的派生和`IDispatch`的实现来完成的。在描述中提到的博客链接可能详细解释了如何在ATL项目中创建和使用Tear-off接口。由于无法直接访问该链接,我会在这里提供一个基本...

Global site tag (gtag.js) - Google Analytics