使用visual studio 2019 ATL模板创建的COM项目,在不同阶段包含的内容:
-
项目创建阶段,使用ATL模板完成vcamera项目的创建:
1.1 源文件
dllmain.cpp dll项目入口C++类
pch.cpp ATL项目预编译时需要的,无需关心
vcamera.cpp vcamera组件类,包含了COM组件注册、移除注册、dll卸载,和获取COM对象方法。
vcamera.def COM组件定义描述文件,
vcamera.idl COM组件IDL语言描述文件
这里可以看到,对于vcamera.def 已经包含了所有外部可以调用的函数定义,这些方法将被用于客户端、COM库、操作系统实现COM组件的基础查询、生命周期管理的功能。
image.png
而vcamera.idl 仅包含的COM lib的描述已经LIBID的定义。
image.png
1.2 头文件
dllmain.h 生命所有dllmain中需要的类的头文件。
framework.h 定义了ATL模板需要的一些声明。
pch.h 预编译时需要
resource.h vc++ 为项目生成的定义文件
targetver.h 定义可用的最高版本的Windows平台
1.3 生成的文件
vcamera_i.c IID, CLSID等定义文件,此阶段为空

vcamera_i.h 接口定义文件,在此阶段为空

- 创建一个简单COM对象VCameraObject后:
2.1源文件
VCameraObject.cpp VCameraObject COM对象的C++文件,当前还未生成代码。
vcamera.idl COM组件IDL语言描述文件,此阶段包含了COM类定义和接口定义:
从下图可以看到,创建了一个coclass类型的com对象VCameraObject, 它包含一个接口:IVCameraObject; 也就是说使用ATL模板在生成简单COM对象的时候会自动默认生成一个COM接口,且当前接口的内容为空:

2.2 头文件
VCameraOjbect.h COM对象 VCameraOjbect的头文件,可以看到它需要继承三个重要的类或接口,其中IVCameraObject 为COM接口。
class ATL_NO_VTABLE CVCameraObject :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CVCameraObject, &CLSID_VCameraObject>,
public IVCameraObject
-
为COM接口创建fillbuffer方法,
3.1源文件
vcamera.idl com描述文件,此时新增了新的接口方法的描述
image.png
VCameraObject COM对象实现的C++文件,此时新增了 fillBuffer的实现
image.png
3.2 头文件
VCameraObject.h COM对象的头文件,测试新增了新的公共方法 fillbuffer:

-
编译项目后
4.1 头文件
vcamera_i.h 增加了COM对象与接口的c/c++定义
image.png
vcamera_i.c 增加了IID, CLSID 等结构的定义,以及对应的vcameraObject 的声明:

也就是说通过编译,项目将生成COM相关的内容:
- CLID, IID, LIBID等结构体,并未COM组件的库,对象,接口创建按个实例方便代码中引用 IID_IVCameraObject, LIBID_vcameraLib,CLSID_VCameraObject
- 为vcamera 声明适合于C和c++的接口,对象,和CLID,IID常量。这个文件将被客户端引用作为连接COM服务器和调用服务器方法使用。
除了以上文件外,ATL项目还同生生成了一些资源文件:
vamera.rc 资源文件用于注册表
vcamera.rgs 注册脚本文件,默认为空
VCameraObject.rgs 项目的实际注册脚本文件

生成解决方案成功后,可以在注册表中找到对应的信息:
HKEY_CLASSS_ROOT\vcamera.VCameraObject[.1]

相对于直接写com程序,ATL已经将很多逻辑封装了起来,不在用关心接口查询,GUID生成,生命周期管理等,只需要专注于业务接口。
网友评论