前提條件
1、掌握C++基礎語法
2、平臺安裝 vs2019
3、本地平臺為 windows 10 1909 X64
4、了解vbs基礎語法
本次目標
1、掌握Com組件的概念及原理
2、撰寫一個簡單的以DLL形式展現的Com組件
3、通過 VBS 實作跨語言呼叫COM
1、Com組件概念及原理
什么是COM:
參考百度百科:COM component(COM組件)是微軟公司為了計算機工業的軟體生產更加符合人類的行為方式開發的一種新的軟體開發技術,在COM構架下,人們可以開發出各種各樣的功能專一的組件,然后將它們按照需要組合起來,構成復雜的應用系統,由此帶來的好處是多方面的:可以將系統中的組件用新的替換掉,以便隨時進行系統的升級和定制;可以在多個應用系統中重復利用同一個組件;可以方便的將應用系統擴展到網路環境下;COM與語言,平臺無關的特性使所有的程式員均可充分發揮自己的才智與專長撰寫組件模塊,
(個人理解:com組件就是一種標準,遵循此標準開發出來的組件則為COM組件,同樣任何語言只要遵循此標準,就可以呼叫該組件,而com組件本質上就是二進制可執行檔案,com以 DLL 或 EXE 形式發布的)
什么是ATL:
參考百度百科:ATL是ActiveX Template Library 的縮寫,它是一套C++模板庫,使用ATL能夠快速地開發出高效、簡潔的代碼(Effective and Slim code),同時對COM組件的開發提供最大限度的代碼自動生成以及可視化支持,為了方便使用,從MicrosoftVisual C++5.0版本開始,Microsoft把ATL集成到Visual C++開發環境中,1998年9月推出的Visual Studio 6.0 集成了ATL 3.0版本,ATL已經成為Microsoft標準開發工具中的一個重要成員,日益受到C++開發人員的重視,
(個人理解:ATL 就是微軟發布的一個C++模板目的是為了簡化COM編程)
什么是ActiveX:
參考百度百科:ActiveX是Microsoft對于一系列策略性面向物件程式技術和工具的稱呼,其中主要的技術是組件物件模型(COM),在有目錄和其它支持的網路中,COM變成了分布式COM(DCOM),ActiveX 控制元件是用于互聯網的很小的程式,有時稱為插件程式,它們會允許播放影片,或幫助執行任務,如在 Microsoft Update 安裝安全更新,因此可以增強您的瀏覽體驗, 在創建包括ActiveX程式時,主要的作業就是組件,一個可以自足的在ActiveX網路(Windows,Mac,Linux)中任意運行的程式,這個組件就是ActiveX控制元件,ActiveX是Microsoft為抗衡Sun Microsystems的JAVA技術而提出的,此控制元件的功能和java applet功能類似,
(個人理解:ActiveX就是Com組件集合的名字,并且主要用在web方面,本質上就是COM)這里參考 360百科 的詞條 [ 大白話容易理解 ]
2、撰寫一個簡單的Com組件
VS2019 新建基于ATL模板的專案 下一步

設定專案名 (注意:專案名一定要記住) 然后創建
設定ATL專案屬性 (這里設定基于.dll 方式)

這里說一下“支持組件注冊”指的是 編譯結束后會自動進行組件注冊
選擇后點擊確定,并等待創建完成
完成后會出現ComTest和ComTestPs,不用管PS

我們點開ComTest并且可以看到系統自動生成的頭檔案和源檔案
現在添加一個新的ATL物件
右鍵ComTest 新建項->添加->新建項

對 ComTest 新建 “ATL簡單物件”并點擊添加

設定短名稱為Temp 其他的會自動填充
ProgID 設定為 專案名+“.”+短名稱 (ComTest.Temp )
檔案型別以及其他默認就好點擊完成
這里需要注意兩個值
ProgID 是之后 vbs 及其他語言 呼叫組件所需要提供的名稱
介面 ITemp 為之后配置 idl 所需要找到的介面名

完成后會在ComTest 下自動添加 Temp.h 以及 Temp.cpp以及生成一個CTemp類


現在就可以創建我們自己的方法
Temp.h頭檔案中給CTemp添加函式宣告

在 Temp.cpp 檔案中實作此函式

值得一提的是
__result 必須為指標用來進行回傳
return 默認為 S_OK表示執行成功
定義好方法后打開 ComTest.idl
還記得我們在創建ATL簡單物件時候設定的“短名稱”嗎 (ITemp 自動命名規則為 I+短名稱)
找到這一段 interface ITemp : IDispatch

在interface ITemp : IDispatch 里面寫入

[in] 表示 輸入 [out] 表示輸出 [retval] 表示作為回傳值給外界
值得一提的是 retval 必須只能有一個 而且必須跟在out 后面
以上就寫好了ComTest組件的全部內容
選擇生成的位數 x64快捷鍵 Ctrl + b 生成 dll

這里會看到生成報錯
不用管他 打開我們的專案目錄

可以看到第一個為生成的ComTest.dll 接下來 注冊Com組件
這里注意兩個檔案
ComTest.dll 為 Com 組件本體
ComTest.tlb 是之后C++ 呼叫Com所需要包含的檔案

管理員權限打開 cmd 或者 powershell
并進入到dll存在的目錄
輸入命令注冊我們的DLL

輸入后會出現 已成功
如果不成功嘗試在管理員權限下去注冊

3、通過 VBS 實作跨語言呼叫COM
撰寫vbs代碼 ComTest.Temp為“ATL簡單物件”設定的“ProgID”而Number為類中的函式名

保存并運行 執行成功

注意事項:
vbs呼叫的com必須為IDispatch 介面
vs2019 ATL 默認為 繼承 IDispatch 介面
Com組件必須注冊后VBS才可以呼叫
Github原始碼地址
3065190005/ComTest: ComTest Code (github.com)
下一篇 實作VBS的CreateObject函式邏輯 通過IDispatch介面呼叫Com
https://www.cnblogs.com/MF-Blog/p/14070878.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228338.html
標籤:C++
