ATL实现COM组件

时间:2020-12-19 23:15:52

参考文献:https://blog.csdn.net/Marcus2006/article/details/41978799

ATL实现COM组件比较简单,关键是在程序中如何调用该组件。

vs2010制作好COM组件后,会自动注册,但是vs2015却没法自动注册。

一,自动注册:

直接从MFC Typelib中导入该组件,导入相应接口,就可以了。

二、非自动注册:

方法一:

只需要两个文件:.tlb文件和.dll文件。

1.导入.tlb文件和.dll文件;

首先将.tlb文件的目录添加到VC++目录-库目录内,将.dll文件放在当前可执行文件目录内。

#import "xx.tlb" no_namespace

#import "xx.dll" no_namespace  (一般将这两句话放在stdafx.h文件中)

添加no_namespace的目的是程序会自动为该COM组件添加命名空间xxLib(其中xx为COM工程名称,添加后就不使用命名空间了。

如果不添加no_namespace,就添加一句using namespace xxLib;

2.编译一下调用程序。

3.注册DLL(参考使用MFC生成COM组件)

用LoadLibrary()获得dll文件句柄,然后获取DllRegister函数进行注册,不多说。

4.调用CoCreateInstance()函数

其中GUID值通过__uuidof(class/interface)获取,原因见后面三。

方法二(不推荐):

1.在COM组件中找到xx_i.h文件和xx_i.c文件,并导入

#include "xx_i.h"

#include "xx_i.c"

2.注册,不多说

3.调用CoCreateInstance()函数

其中的guid值,直接包含在xx_i.c文件中,直接使用。

即,CLSID_XX和IID_IXX

三、tlb文件的关键作用

我们在第一步导入tlb文件,第二步编译一下调用程序,实际上是让编译器将xx.tlb文件编译成两个文件,xx.tli文件和xx.tlh文件。

xx.tlh文件:该文件包含了COM组件所有接口,类和它们的GUID值。

xx.tli文件:该文件包含了组件类的方法声明。

看到没,只有首先生成了这两个文件,才能获取类和接口的GUID值。

__uuidof(classname/interfacename),该函数的参数是COM类名或接口名称,通过该函数就可以获取相应接口和类的GUID值。