当前位置: 首页 > news >正文

com教程(使用VS2015编写ATL示例)

        ATL(ActiveX Template Library)是微软的活动模板库,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码,同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持,是用来建立COM组件的工具

        为了方便使用,从Microsoft VisualC++5.0版本开始,Microsoft把ATL集成到VisualC++开发环境中。1998年9月推出的VisualStudio6.0集成了ATL3.0版本。 在ATL产生以前,开发COM组件的方法主要有两种:一是使用COMSDK直接开发COM组件另一种方式是通过MFC提供的COM支持来实现。 直接使用COMSDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包,我们可以直接编写COM程序。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解(虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的,但对于COM这样一整套复杂的技术而言,在短时间内完全掌握是很难的);另一方面,直接使用COMSDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COMSDK不是一种理想的开发方式。 使用MFC提供的COM支持开发COM应用可以说在使用COMSDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。 随着Internet技术的发展,Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广,然而使用MFC开发的ActiveXControl,代码冗余量大,即所谓的“肥代码”(FatCode),而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关,但是由于MFC的继承实现的本质,ActiveXControl必须背负运行时刻库这个沉重的包袱。如果采用静态连接MFC运行时刻库的方式,这将使ActiveXControl代码过于庞大,在网络上传输时将占据宝贵的网络带宽资源;如果采用动态连接MFC运行时刻库的方式,这将要求浏览器一方必须具备MFC的运行时刻库支持。总之,MFC对COM技术的支持在网络应用的环境下也显得很不灵活。 MFC对COM和OLE的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持还不够完善和彻底,例如对COM接口定义的IDL语言,MFC并没有任何支持,此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。MFC被设计成对Windows平台编程开发的面向对象的封装,自然要涉及Windows编程的方方面面,COM作为Windows平台编程开发的一个部分也得到MFC的支持,但是MFC对COM的支持是以其全局目标为出发点的,因此对COM的支持必然要服从其全局目标。从这个方面而言,MFC对COM的支持不能很好地满足开发者的要求。 对于程序员来说,还有一个区别就是ATL要求你懂得更多的COM知识,这样你才能直接使用ATL来编写COM组件或者控件,而MFC甚至不要求你知道COM是个什么东西就能写出一个ActiveX控件来了。 此外,如果你编写的控件有GUI(图形用户界面)的话,你最好使用MFC;如果根本不需要GUI,那最好使用ATL编写,当然你也可以选择MFC来编写不可见的控件,但是开销比ATL大,而执行效率却小于ATL;但是有时候这种差别所带来影响可以忽略掉的话,那么我建议你还是用MFC来写,唯一的理由是它开发起来更简单,易于调试。如果你是一个COM的门外汉,却又想使用ATL来编写控件,那么建议你先准备半年时间(保守估计)来学习COM的理论知识。简单地说,ATL在网络应用普及的今天,开发效果(简洁\高效)要比MFC好。但我本人觉得MFC也不差!我一直在用MFC做事!

        因为在windows系统中,我们通常会把一些通用性强的程序做成dll(动态链接库)来让其它程序调用,这样可以避免重复开发相同的程序。然而,不同语言开发出来的dll的调用约定可能是不一样的,因此,当你要调用别人开发的dll时,如果别人和你用的语言不一样,就很可能无法调用。而COM组件就完美的解决了这个问题,不仅所有语言都可以调用它,而且调用起来很方便。但是如果要让我们自己从零开始来手动编写一个COM组件是很困难很烦琐的,于是微软就开发了一个库——活动模板库(ATL),它把COM组件底层的烦琐的实现细节都封装起来,我们就可以通过调用ATL来开发COM组件了。

(1)首先新建ATL项目,进入向导,如图下选择

(2)VS2015自动生成两个项目其中一个和你刚才新建的项目同名,同名项目上右击,添加类,然后选择ATL简单对象

点击添加,输入简称即可,后面的自动生成。

(3)在类视图下,选择刚才添加类名前面+I的类,右击添加方法

如图所示,添加参数,注意,只有指针类型的参数才能被设置为输出参数

(4)在所建类的cpp文件中,补全代码实现逻辑。然后编译。注意此时要求VS2015具有管理员权限.此步骤中该com组件自动完成在操作系统中的注册

(5)然后就是新建一个wpf或者winform来验证我们所编写的程序了

在新建的WPF工程上添加对我们刚才的com的引用

(6)补全WPF工程代码

主窗口的代码如下

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            testATLLib.helloATLClass a = new testATLLib.helloATLClass();
            int ret = a.Add(1, 1);
            ret = a.Add(2, 3);
        }
    }
}

(7)将所加入的引用的嵌入互操作类型改为false

(8)运行调试即可

相关文章:

  • 控制台console使用MFC库函数,Cout输出CString的方法
  • PDFsharp使用介绍
  • 详解开源免费且稳定实用的.NET PDF打印组件itextSharp
  • 机器人是什么
  • C++中L和_T()之区别
  • 关于 wcout 输出中文的问题
  • 非静态成员必须与特定对象相对
  • 压缩文件修复
  • 循环冗余校验(CRC)算法入门引导
  • C++ getline函数用法详解
  • cout后面输出时加endl和不加endl的区别
  • iostream
  • ChromeNativeMessaging 原生消息通信
  • IT前端开发和后端开发
  • socket原理及实例
  • 07.Android之多媒体问题
  • C学习-枚举(九)
  • docker-consul
  • Git学习与使用心得(1)—— 初始化
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js算法-归并排序(merge_sort)
  • LeetCode18.四数之和 JavaScript
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Nacos系列:Nacos的Java SDK使用
  • Python socket服务器端、客户端传送信息
  • windows下使用nginx调试简介
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 山寨一个 Promise
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​第20课 在Android Native开发中加入新的C++类
  • ​学习一下,什么是预包装食品?​
  • #Java第九次作业--输入输出流和文件操作
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (三)elasticsearch 源码之启动流程分析
  • (转)Oracle存储过程编写经验和优化措施
  • (转)创业家杂志:UCWEB天使第一步
  • *Django中的Ajax 纯js的书写样式1
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core 6 redis操作类
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET导入Excel数据
  • :如何用SQL脚本保存存储过程返回的结果集
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [AR]Vumark(下一代条形码)
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [leetcode]Search a 2D Matrix @ Python
  • [luoguP2401] 不等数列
  • [macOS] Mojave10.14 夜神安卓模拟器启动问题
  • [Python] scikit-learn之mean_squared_error函数(Mean Squared Error(MSE))介绍和使用案例