使用visual studio 2019 ATL模板創(chuàng)建的COM項(xiàng)目,在不同階段包含的內(nèi)容:
-
項(xiàng)目創(chuàng)建階段,使用ATL模板完成vcamera項(xiàng)目的創(chuàng)建:
1.1 源文件
dllmain.cpp dll項(xiàng)目入口C++類
pch.cpp ATL項(xiàng)目預(yù)編譯時(shí)需要的檀夹,無需關(guān)心
vcamera.cpp vcamera組件類张肾,包含了COM組件注冊速勇、移除注冊、dll卸載凛捏,和獲取COM對象方法担忧。
vcamera.def COM組件定義描述文件,
vcamera.idl COM組件IDL語言描述文件
這里可以看到葵袭,對于vcamera.def 已經(jīng)包含了所有外部可以調(diào)用的函數(shù)定義涵妥,這些方法將被用于客戶端乖菱、COM庫坡锡、操作系統(tǒng)實(shí)現(xiàn)COM組件的基礎(chǔ)查詢、生命周期管理的功能窒所。
image.png
而vcamera.idl 僅包含的COM lib的描述已經(jīng)LIBID的定義鹉勒。
image.png
1.2 頭文件
dllmain.h 生命所有dllmain中需要的類的頭文件。
framework.h 定義了ATL模板需要的一些聲明吵取。
pch.h 預(yù)編譯時(shí)需要
resource.h vc++ 為項(xiàng)目生成的定義文件
targetver.h 定義可用的最高版本的Windows平臺
1.3 生成的文件
vcamera_i.c IID, CLSID等定義文件禽额,此階段為空
vcamera_i.h 接口定義文件,在此階段為空
- 創(chuàng)建一個(gè)簡單COM對象VCameraObject后:
2.1源文件
VCameraObject.cpp VCameraObject COM對象的C++文件皮官,當(dāng)前還未生成代碼脯倒。
vcamera.idl COM組件IDL語言描述文件,此階段包含了COM類定義和接口定義:
從下圖可以看到捺氢,創(chuàng)建了一個(gè)coclass類型的com對象VCameraObject, 它包含一個(gè)接口:IVCameraObject; 也就是說使用ATL模板在生成簡單COM對象的時(shí)候會自動(dòng)默認(rèn)生成一個(gè)COM接口藻丢,且當(dāng)前接口的內(nèi)容為空:
2.2 頭文件
VCameraOjbect.h COM對象 VCameraOjbect的頭文件,可以看到它需要繼承三個(gè)重要的類或接口摄乒,其中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描述文件馍佑,此時(shí)新增了新的接口方法的描述
image.png
VCameraObject COM對象實(shí)現(xiàn)的C++文件斋否,此時(shí)新增了 fillBuffer的實(shí)現(xiàn)
image.png
3.2 頭文件
VCameraObject.h COM對象的頭文件,測試新增了新的公共方法 fillbuffer:
-
編譯項(xiàng)目后
4.1 頭文件
vcamera_i.h 增加了COM對象與接口的c/c++定義
image.png
vcamera_i.c 增加了IID, CLSID 等結(jié)構(gòu)的定義拭荤,以及對應(yīng)的vcameraObject 的聲明:
也就是說通過編譯茵臭,項(xiàng)目將生成COM相關(guān)的內(nèi)容:
- CLID, IID, LIBID等結(jié)構(gòu)體,并未COM組件的庫舅世,對象旦委,接口創(chuàng)建按個(gè)實(shí)例方便代碼中引用 IID_IVCameraObject, LIBID_vcameraLib歇终,CLSID_VCameraObject
- 為vcamera 聲明適合于C和c++的接口社证,對象,和CLID,IID常量评凝。這個(gè)文件將被客戶端引用作為連接COM服務(wù)器和調(diào)用服務(wù)器方法使用追葡。
除了以上文件外,ATL項(xiàng)目還同生生成了一些資源文件:
vamera.rc 資源文件用于注冊表
vcamera.rgs 注冊腳本文件,默認(rèn)為空
VCameraObject.rgs 項(xiàng)目的實(shí)際注冊腳本文件
生成解決方案成功后宜肉,可以在注冊表中找到對應(yīng)的信息:
HKEY_CLASSS_ROOT\vcamera.VCameraObject[.1]
相對于直接寫com程序匀钧,ATL已經(jīng)將很多邏輯封裝了起來,不在用關(guān)心接口查詢谬返,GUID生成之斯,生命周期管理等,只需要專注于業(yè)務(wù)接口遣铝。