ATL 创建COM对象

之前写了一篇原始dll的创建过程,以及直接使用LoadLibrary加载动态库。

但ATL所做的一个很重要的功能就是引入COM对象这个概念。

首先, ATL active template library为活动模板库,ATL为asp代码中提供COM对象应用。而一般使用活动模版库来创建COM组件。简单来说ATL一般作为方便快捷的COM开发工具使用。而ATL中使用的基本技术为 COM技术,C++模版技术和C++多继承技术。

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

1.新建一个ATL项目:

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

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

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

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

3.在向导中添加类名:

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

在选项中还有更具体的一些设置:

直接点完成。

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

在接口上添加方法,会有以下详细的信息:

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

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

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

最后的参数为:

点完成。

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的内部实现中,所有的类的是继承与这个UnKnown基类。

然后看 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-10-09 01:25:02

ATL 创建COM对象的相关文章

ATL揭秘之“对象创建”篇

ATL揭秘之“对象创建”篇 程  化 1         问题 当我们用VC++ ATL工程创建了一个COM工程,实现了一个自己的COM对象,又在另一个程序中CoCreateInstance这个COM对象时,不知你是否想过这样的问题:COM对象是用C++类对象实现的,但是,我们从来没有在自己的代码中创建这些C++类对象——比如,“new”这些对象.那么,实现COM对象的C++对象是由谁,何时,以及如何创建的呢? 当然,简单而且正确的回答是:ATL在幕后帮助我们完成了这些工作.如果你不想了解ATL

创建jedis对象

1.先在taotao-parent的pom.xml中复制 以下内容到rest的pom.xml中 <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> 2.创建jedi

三种创建XMLHttpRequest对象的方法

XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples&

JavaScript中创建自定义对象的方法

本文内容参考JavaScript高级程序设计(第3版)第6章:面向对象的程序设计 ECMA-262中把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”我所理解的就是对象就是一个结构体,结构体中有一些它的基本属性以及对结构体处理的方法,把它们封装起来称为一个整体.JS中所有的对象都是基于一个引用类型创建,这个引用类型可以是原生类型,如Array,Date等,也可以是开发人员自定义的类型. 下面主要总结下JS中创建对象的几种模式,分析他们各自的优缺点. 1. 工厂模式 /****

【OC语法快览】三、创建实例对象

Creating Objects  创建对象 There are two main ways to create an object. The first is the one you saw before: 创建对象主要有两种方法.第一种如下: NSString* myString = [NSString string]; This is the more convenient automatic style. In this case, you are creating an autorel

Floodlight 中创建消息对象的方法

在 floodlight 中创建各种openflow message 和 action 等采用的是简单工厂方式,BasicFactory类(实现OFMessageFactory接口,)会根据消息的类型创建不同的对象,达到更好的封装效果:此外这里调用的是枚举类型的方法.下面是具体代码: ----------工厂接口,还有OFActionFactory,约束需要具体工厂完成的事情 public interface OFMessageFactory { // 根据消息类型得到具体的实例 public 

VirtualBox创建com对象失败,解决方法。

右键VirtualBox的桌面快捷方式,选择属性,选到兼容性选项卡,勾选"以兼容模式运行这个程序",下拉框选择Windows Server 2008 (Service Pack 1),再勾选"以管理员身份运行此程序",确定.重新打开,就OK了. VirtualBox创建com对象失败,解决方法.,布布扣,bubuko.com

ATL创建COM步骤

1 新建ATL工程,默认选项:动态链接库(DLL) 2 右键单击工程添加一个新的类,ATL-> ATL简单对象 默认下一步完成. 能够看到类视图中出现了刚刚建立的接口. 3 右键单击接口->添加方法 填写方法名和参数属性,下一步完成.注意out必须为指针类型如 int* 是否选择retval 会对返回类型产生影响. 4 在工程中找到这个类 编写方法内容 编译后会自动进行注册. ATL创建COM步骤,布布扣,bubuko.com

在js中使用createElement创建HTML对象和元素 (转)

1.创建链接 <script language="javascript"> var o = document.body; //创建链接 function createA(url,text) { var a = document.createElement("a"); a.href = url; a.innerHTML = text; a.style.color = "red"; o.appendChild(a); } createA(