前提條件
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)