使用visual studio 2019 ATL模板創(chuàng)建的COM項目,在不同階段包含的內(nèi)容:
-
項目創(chuàng)建階段,使用ATL模板完成vcamera項目的創(chuàng)建:
1.1 源文件
dllmain.cpp dll項目入口C++類
pch.cpp ATL項目預編譯時需要的,無需關心
vcamera.cpp vcamera組件類,包含了COM組件注冊、移除注冊、dll卸載,和獲取COM對象方法。
vcamera.def COM組件定義描述文件,
vcamera.idl COM組件IDL語言描述文件
這里可以看到,對于vcamera.def 已經(jīng)包含了所有外部可以調(diào)用的函數(shù)定義,這些方法將被用于客戶端、COM庫、操作系統(tǒng)實現(xiàn)COM組件的基礎查詢、生命周期管理的功能。
image.png
而vcamera.idl 僅包含的COM lib的描述已經(jīng)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 接口定義文件,在此階段為空

- 創(chuàng)建一個簡單COM對象VCameraObject后:
2.1源文件
VCameraObject.cpp VCameraObject COM對象的C++文件,當前還未生成代碼。
vcamera.idl COM組件IDL語言描述文件,此階段包含了COM類定義和接口定義:
從下圖可以看到,創(chuàng)建了一個coclass類型的com對象VCameraObject, 它包含一個接口:IVCameraObject; 也就是說使用ATL模板在生成簡單COM對象的時候會自動默認生成一個COM接口,且當前接口的內(nèi)容為空:

2.2 頭文件
VCameraOjbect.h COM對象 VCameraOjbect的頭文件,可以看到它需要繼承三個重要的類或接口,其中IVCameraObject 為COM接口。
class ATL_NO_VTABLE CVCameraObject :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CVCameraObject, &CLSID_VCameraObject>,
public IVCameraObject
-
為COM接口創(chuàng)建fillbuffer方法,
3.1源文件
vcamera.idl com描述文件,此時新增了新的接口方法的描述
image.png
VCameraObject COM對象實現(xiàn)的C++文件,此時新增了 fillBuffer的實現(xiàn)
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相關的內(nèi)容:
- CLID, IID, LIBID等結構體,并未COM組件的庫,對象,接口創(chuàng)建按個實例方便代碼中引用 IID_IVCameraObject, LIBID_vcameraLib,CLSID_VCameraObject
- 為vcamera 聲明適合于C和c++的接口,對象,和CLID,IID常量。這個文件將被客戶端引用作為連接COM服務器和調(diào)用服務器方法使用。
除了以上文件外,ATL項目還同生生成了一些資源文件:
vamera.rc 資源文件用于注冊表
vcamera.rgs 注冊腳本文件,默認為空
VCameraObject.rgs 項目的實際注冊腳本文件

生成解決方案成功后,可以在注冊表中找到對應的信息:
HKEY_CLASSS_ROOT\vcamera.VCameraObject[.1]

相對于直接寫com程序,ATL已經(jīng)將很多邏輯封裝了起來,不在用關心接口查詢,GUID生成,生命周期管理等,只需要專注于業(yè)務接口。




