我原来以前写dll创建过程,而直接使用LoadLibrary加载动态库。

但ATL提出了一个非常重要的特点是引入COM对象的概念。

首先。 ATL active template library该活动模板库。ATL至asp提供代码COM应用。

而一般使用活动模版库来创建COM组件。简单来说ATL一般作为方便快捷的COM开发工具使用。

而ATL中使用的基本技术为 COM技术。C++模版技术和C++多继承技术。

接下来是使用ATL开发一个COM组件的基本过程。附带截图:

1.新建一个ATL项目:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

随便取个名字,然后确定。

设置向导里直接选完毕,这里就是简单的创建一个dll文件。

2. 然后是在项目中选择加入一个新的类:

新类选择为ATL中的ATL简单对象:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

3.在向导中加入类名:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

会发现。向导会自己主动生成其它信息,如类名。组件类名。接口名等。

在选项中还有更详细的一些设置:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

直接点完毕。

4.在类视图中,我们看到有生成的Cfirst类和Ifirst 接口。

在接口上加入方法。会有下面具体的信息:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

填上方法名,然后加入參数。com函数的返回值都是用来检測dll函数是否正确载入并执行的。所以要使用參数作为返回值来传递。这里实现一个简单的加法函数。对于这个函数,其參数为 A,B,和Ret。ret是一个long* 。用来储存返回值。

点in。说明这个參数是是输入的參数。在生成的代码处会自己主动加入_in_ ,提示这里是输入的參数,但没有太大的实际作用。在參数类型中寻找相应的数据类型,并填上相应的參数名:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

对于函数没有返回值的话,通常会将最后一个參数设置为指针类型。用其记录函数返回值:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

最后的參数为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvX3hpYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

点完毕。

5.改动生成的代码。加入实现。

首先我们双击接口,会进入一个MyFirstDll.idl 的文件里,当中有下面代码:

interface Ifirst : IUnknown{
[] HRESULT Add([in] LONG A, [in] LONG B, [out,retval] LONG* Ret);
};
[
uuid(F7DAFD6A-C1DB-46AF-9CF9-62EC0D7D589F),
version(1.0),
]
library MyFirstDllLib
{
importlib("stdole2.tlb");
[
uuid(D2F7F834-D4A2-4AB7-B5BE-B08D1EB35564)
]
coclass first
{
[default] interface Ifirst;
};
};

是供其它语言或系统中使用的接口。

这里的IUnknown也是值得注意的地方,在COM的内部实现中。全部的类的是继承与这个IUnKnown基类。

对于ATL COM中的一些更加深入的细节。包含:(IUnKnown三个函数,另外两个类CComCoClass . CComObjectRootEx 。DLL的注冊与反注冊。对象的析构函数以及内存申请与释放。首先 com对象中使用new或 CoTaskMemAlloc申请内存都能够,前者是内部自己使用。自己释放。后者可能申请的内存给对方使用,所以对方能够同过相应的方法来释放内存。)这些内容以后有空再更加具体的去学习吧,先挖个坑。以后有空再填。

然后看 first.h。 头文件里关于Cfirst类的声明例如以下:

class ATL_NO_VTABLE Cfirst :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<Cfirst, &CLSID_first>,
public Ifirst
{
public:
Cfirst()
{
} DECLARE_REGISTRY_RESOURCEID(IDR_FIRST) DECLARE_NOT_AGGREGATABLE(Cfirst) BEGIN_COM_MAP(Cfirst)
COM_INTERFACE_ENTRY(Ifirst)
END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
{
return S_OK;
} void FinalRelease()
{
} public: STDMETHOD(Add)(LONG A, LONG B, LONG* Ret);
};

这里就体现了ATL的基本技术,多继承以及模版。继承 的 内容 有一个 Ifirst , 为之前在idl文件里的接口。在编译器中,对于这个Ifirst接口直接是红下划线表示错误,说明事实上现是一个动态的过程,至于详细是怎样的。我就不想太深入了解了。

这个类声明中有很多复杂的宏的使用。这不是重点,重点是public 中的add函数声明。

然后我们进入 Cfirst.cpp中。在add函数中加上简单的实现:

STDMETHODIMP Cfirst::Add(LONG A, LONG B, LONG* Ret)
{
// TODO: 在此加入实现代码
*Ret = A+B;
return S_OK;
}

这样就实现了一个简单的COM组件。

6. 点生成,生成dll。



之后是转让COM物。

版权声明:本文博主原创文章,博客,未经同意不得转载。

ATL 创COM物的更多相关文章

  1. 机器学习:gensim之Word2Vec 详解

    一 前言 Word2Vec是同上一篇提及的PageRank一样,都是Google的工程师和机器学习专家所提出的的:在学习这些算法.模型的时候,最好优先去看Google提出者的原汁Paper和Proje ...

  2. STL,ATL,WTL之间的联系和区别

    STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R M ...

  3. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  4. linux C 线程池(物不可穷也~)

    Linux 多线程编程之 线程池 的原理和一个简单的C实现,提高对多线程编 程的认知,同步处理等操作,以及如何在实际项目中高效的利用多线程开 发. 1.  线程池介绍 为什么需要线程池??? 目前的大 ...

  5. ATL封装IE内核启示:使用Win32/ATL建立窗口

    开发大型GUI界面程序MFC当仁不让,但如果是开发图形应用程序,并不需要大规模界面控件,没有必要链接庞大的MFC库,直接使用platform sdk会很麻烦,这时ATL中的关于Windows的封装就是 ...

  6. java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码

    随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题 ...

  7. 心无旁骛,向死而生:WGDC2016给创企上的一堂课

    "这是最好的时代,也是最坏的时代:这是希望的春天,也是失望的冬天." ------狄更斯 WGDC2016落幕已经一月有余,我仍然记得会议结束后,穿过高大宽敞的国家会议中心大厅,走 ...

  8. iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】

    投诉公司: 北京直信创邺数码科技有限公司  标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...

  9. 使用VC++ ATL实现iStylePDF的COM插件

    本文介绍了一种使用VC++ ATL(Active Template Library),利用ISPExtensibility接口,为 iStylePDF 加入功能简单的COM插件(addin),加入工具 ...

随机推荐

  1. 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiX

    原文:使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)--初识WiX Visual Studio 打包安装七宗罪 开发.NET的人,肯定会使用Visual ...

  2. poj3206(bfs+最小生成树)

    传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...

  3. codeforces#256DIV2 D题Multiplication Table

    题目地址:http://codeforces.com/contest/448/problem/D 当时是依照找规律做的,规律倒是找出来了,可是非常麻烦非常麻烦. . 看到前几名的红名爷们3分钟就过了, ...

  4. F5 root密码恢复

    使用串口线缆链接F5的串口和PC相连接,调节串口的波特率为12000,重启F5 后在启动菜单上和linux 单用户模式一样操作即可.

  5. CSDN开源夏令营 百度数据可视化实践 ECharts(8)问题分析

    ECharts问题描写叙述: 问题就是折线图上的点是显示的,有人问能不能一開始不显示,当你点击的时候或者是当鼠标移动到上面的时候,折线上的点才显示? 例如以下图所看到的: 分析:让折线上的点不显示能够 ...

  6. mindmanager2012打开文件出现runtime error r6025 解决方式

    关于mindmanager 2012启动无法执行,提示c++错误 ---------------------------Microsoft Visual C++ Runtime Library---- ...

  7. sql语句中 limi的用法

    SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 使用查询语句时需要返回前几条或者中间的某几行数据时可以用到limit 例如 ...

  8. poj3126解题报告

    题意:简单的说就是:有一个人门牌号是一个四位数的整数,并且还是一个素数,现在他想要换成另外一个四位数且是素数的门牌号,而且,每次都只能更换这个四位数的一个位置的数 ,也就是每换一次都只改变一个数字,而 ...

  9. 自定义JSTL函数标签(一)

    jstl标签库的配置 * 将jstl.jar和standard.jar拷贝到WEB-INF/lib下(如果使用el表达式,不用拷贝这两个jar) 注意:jstl必须在能够支持j2ee1.4/servl ...

  10. Thinkpad X200 屏幕备案

    妈妈蛋,屏幕废物前几天(闪屏->暗->变暗),因此,它只能监视房外 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk2NTg5MA= ...