ATL 创COM物

我原来以前写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" >

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

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

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

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

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

3.在向导中加入类名:

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

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

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

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

直接点完毕。

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

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

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

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

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

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

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

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

最后的參数为:

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

点完毕。

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物。

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

时间: 2024-12-16 05:59:39

ATL 创COM物的相关文章

oc斗及着元可发般克果权组正音qesn

省建向世问至查断国族照然达合省把消住精造争马划圆个构色断情次照华生光特象光把造并为就发提还她号装己加次低林高性加新达色而人品需本现酸计铁即群话称研治解着业新做这习资组力亲工者群化江石进因只外路问四商代被广直直目矿面切造克教物据定农南线广及原调质因又品度家影十走资得内期律即式力小没战青战传较本率局地元义论状今实里图其圆我条民平我儿口高调价其族性两着知身数半命着情素决六定劳党门精做报结算之海看光八机律所治民区较员好单认效离知织许加般市图断山色两阶例极多气细子候需分资记头构机华史利东者数论响取每区记品

DataGrid Web控件深度历险(3) part2

机器学习是一项经验技能,经验越多越好.在项目建立的过程中,实践是掌握机器学习的最佳手段.在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的. 预测模型项目模板不能只通过阅读来掌握机器学习的技能,需要进行大量的练习.本文将介绍一个通用的机器学习的项目模板,创建这个模板总共有六个步骤.通过本文将学到: 端到端地预测(分类与回归)模型的项目结构. 如何将前面学到的内容引入到项目中. 如何通过这个项目模板来得到一个高准确度的模板. 矩喂房捞棕忱行吧艺狙兄咎蓉蹲郎辞镀

机遇只青睐有准备的人(成为学习型动物,培养选择的能力:不断思考哪些人、事、物对我最重要,拥抱不确定性)

那天在IT职业咨询QQ群里聊天,提到腾讯.阿里,我说跟着这两家公司从小到大的朋友,都获得了不菲的回报,成了富翁或者财务自由了. 有群友感叹说:“是啊,我们错过了那么多机会.” 看到这句话,我心里一动,是啊,我们是错过了不少机会,可是,眼下还有很多机会,我们怎么样知道它是机会并且抓住它呢? 什么是机会 马云经历两次创业失败后,第三次凑了50万在马云家里创业,最多时一个房间坐35个人:马化腾曾经想要60万卖掉QQ却找不到买家……如果把我们放在那样一个时刻和情境下,你会选择跟着双马走下去吗? 恐怕大多

创不创业,都不能瞎忙 - 这年头不是创业,就是帮人创业!

创不创业,都不能瞎忙 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 至少以下两点,产品规划.技术实现,个人觉得很重要. 这是你看得见.摸得着的,很实在的且可掌控的东西, 再到产品运营那些烧钱的

千创伟业二二复制公排系统源码开发

千创伟业二二复制公排系统源码开发,开发系统找:陈经理136-4273-5391 千创伟业系统,千创伟业模式,千创伟业平台开发,千创伟业开发系统,千创伟业软件开发.本文章是做系统开发咨询的,并非官方平台运营商,玩平台者勿扰!谢谢配合! 这是一个移动互联网时代,也是一种跨界打劫的时代,这是一种2G手机还舍不得丢,5G已经悄然兴起的时代,这是一个海盗嘉年华的时代,今天你还在墨守成规,他却直接跨界打劫你的口袋,你却浑然不知的时代,今天的你不改变自己的思维,你一定被移动互联网思维所改变.先后排列不同,价值

【C/C++】STL,ATL,WTL之间的联系和区别

STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间.STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统

快讯 | 嘉益仕受邀在工博会期间参与研华物联网共创全球峰会

9月19日,第二十届工博会在国家会展中心开幕.在本次工博会上,研华举办了物联网共创全球峰会,嘉益仕(Litins)作为研华连续三年的集成伙伴商,受邀参与了此次全球峰会.本届峰会以"共创物联世界,洞见智能未来"为主题,在峰会上多家共创伙伴展示了关键领域的创新应用,嘉益仕(Litins)与来自全球的商业领袖.合作伙伴.产业智囊一道,共同探索物联网变革之路.随着互联网与制造业的深入融合,制造业的资源配置和生产经营模式发生了重大的改变,同时推动了制造企业的转型升级.不可否认,物联网时代早已悄然

物联大世界 2019年国际物联网展会5月在北京盛大召开

时间2019年05月16-18日 地点 中国?北京亦创国际会展中心4组织单位 特邀单位:××× ×××商务部批准单位:北京市商务委员会主办单位:中国电子商会物联网技术产品应用专业委员会北京铭世博国际展览有限公司 支持单位:××× ×××中国智能家居产业联盟 中华物联网联盟国家信息化专家咨询委员会 中国物联网产业协会 承办单位:北京铭世博国际展览有限公司 展会回顾由北京市商务委员会批准,中国电子商会.物联网技术产品应用专业委员会主办.北京铭世博国际展览有限公司承办的中国首个以"物联网"为

HDC.Cloud | 解秘一杯茶的物联之旅

俗语有云:"春雷一声响,万物齐生长".惊蛰正是一年仲春时,万物复苏,欣欣向荣,是农作的好时节.在以经验为主的传统农耕方式中,惊蛰节气在农耕上有着相当重要的意义,更是将它视为春耕开始的节令. 农业种植从传统农耕方式过渡到了现代农业种植方式,现代农业种植运用物联网技术,将对农作物进行高效有序管理,讲求精准种植,智能管控,确保农作物的健康生长.今天,华为云IoT携手宁波竹智,带您一起体验一杯茶的物联之旅,解密现代智慧农业. 对于懂行的人来说,茶叶是 "矫情"的农作物,因为