ATL COM模板生成項目文件解讀

使用visual studio 2019 ATL模板創(chuàng)建的COM項目,在不同階段包含的內(nèi)容:

  1. 項目創(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等定義文件,此階段為空


image.png

vcamera_i.h 接口定義文件,在此階段為空


image.png
  1. 創(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)容為空:

image.png

2.2 頭文件
VCameraOjbect.h COM對象 VCameraOjbect的頭文件,可以看到它需要繼承三個重要的類或接口,其中IVCameraObject 為COM接口。
class ATL_NO_VTABLE CVCameraObject :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CVCameraObject, &CLSID_VCameraObject>,
public IVCameraObject

  1. 為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:


image.png
  1. 編譯項目后
    4.1 頭文件
    vcamera_i.h 增加了COM對象與接口的c/c++定義


    image.png

vcamera_i.c 增加了IID, CLSID 等結構的定義,以及對應的vcameraObject 的聲明:


image.png

也就是說通過編譯,項目將生成COM相關的內(nèi)容:

  1. CLID, IID, LIBID等結構體,并未COM組件的庫,對象,接口創(chuàng)建按個實例方便代碼中引用 IID_IVCameraObject, LIBID_vcameraLib,CLSID_VCameraObject
  2. 為vcamera 聲明適合于C和c++的接口,對象,和CLID,IID常量。這個文件將被客戶端引用作為連接COM服務器和調(diào)用服務器方法使用。

除了以上文件外,ATL項目還同生生成了一些資源文件:
vamera.rc 資源文件用于注冊表
vcamera.rgs 注冊腳本文件,默認為空
VCameraObject.rgs 項目的實際注冊腳本文件


image.png

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


image.png

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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容