1、打開VS2010,新建ATL COM 項(xiàng)目,步驟:“文件” --》“新建” --》“項(xiàng)目”,選擇“Visual C++” --》“ATL 項(xiàng)目” ,填寫“名稱” FirstCOM --》“確定”。
2、ATL 項(xiàng)目向?qū)?,勾選 【支持COM+ 1.0】和【支持部件注冊器】,其他默認(rèn),點(diǎn)擊完成。
3、切換到類視圖,右鍵單擊項(xiàng)目“FirstCOM”--》“添加” --》“類”。
4、選“ATL” --》“ATL 簡單對象” --》“添加”。
5、ATL 簡單對象向?qū)?,“簡稱”中輸入類名稱FirstClass,其他輸入框會(huì)自動(dòng)填寫,最下面的“ProgID”沒有自動(dòng)填寫,最好自己寫上一個(gè),如FirstCOM.math,否則后面無法正確調(diào)用組件,點(diǎn)擊“完成”。如果出現(xiàn)提示【是否覆蓋現(xiàn)有文件】,點(diǎn)擊【是】即可。
6、切換到類視圖,選中剛才添加的接口IFirstClass,如下,然后右鍵單擊【添加】添加方法。
7、添加方法向?qū)?,?方法名" 下輸入Add。增加兩個(gè)輸入?yún)?shù):勾選【in】,選擇參數(shù)類型LONG,輸入?yún)?shù)名para1,點(diǎn)擊“添加”。同樣操作增加參數(shù)para2。然后增加一個(gè)返回參數(shù):先選擇參數(shù)類型LONG*,再勾選【retval】,輸入?yún)?shù)名result,點(diǎn)擊添加。點(diǎn)擊“完成”即可,如果點(diǎn)擊下一步,不需要填寫信息,點(diǎn)擊“完成”即可。
8、切換到解決方案資源管理器,展開項(xiàng)目“源文件”, 雙擊 FirstCom.idl 打開IDL定義文件,看到如下代碼,就是定義的COM方法了。
9、雙擊打開FirstClass.cpp 編輯代碼:*result = para1 + para2
10、編譯運(yùn)行,會(huì)生成dll文件,并自動(dòng)注冊到系統(tǒng)中。
問題及解決方法
問題1:我在Win64位系統(tǒng)中編譯的,出現(xiàn)錯(cuò)誤:無法打開預(yù)編譯頭文件:“Debug\FirstCOM.pch”:No such file or directory。
解決:右鍵點(diǎn)擊你創(chuàng)建的項(xiàng)目,選擇“屬性”,彈出“FirstCOM 屬性頁”,在左側(cè)展開"配置屬性"--》展開“C/C++”--》選中“預(yù)編譯頭”,在右邊的“預(yù)編譯頭”下拉菜單中選擇“不使用預(yù)編譯頭文件”,點(diǎn)擊“確定”按鈕退出。
原因分析:編譯器一般都是以文件為單位進(jìn)行編譯,如果修改了工程中的一個(gè)文件,那么將導(dǎo)致所有文件都要重新編譯,這樣的編譯將耗費(fèi)很長時(shí)間。為了提高編譯速度,將那些不常被修改,比較穩(wěn)定,文件單獨(dú)包含到一個(gè)指定的頭文件中,然后生成一個(gè)預(yù)編譯頭文件 *.pch 。 VC++中默認(rèn)的頭文件為 stdAfx.h, 但光有頭文件無法編譯,所以還要用到StdAfx.cpp,StdAfx.cpp里只包含一句有效代碼,這樣編譯時(shí),通過編譯 stdAfx.cpp就把大部分系統(tǒng)頭文件編譯進(jìn)來, Debug目錄下便會(huì)產(chǎn)生一個(gè) 存儲(chǔ)了預(yù)編譯信息的 *.pch 文件。如果 *.pch文件損壞或者不存在,就會(huì)出現(xiàn)“問題1”所示的無法打開預(yù)編譯頭文件的錯(cuò)。
如需深究,可參考博客:無法打開包括文件:“Stdfx.h”
問題2:解決了問題1之后,又出現(xiàn):errorMSB8011: 未能注冊輸出。請嘗試啟用“逐用戶重定向”,或者使用提升的權(quán)限從命令提示符處注冊該組件。
解決:項(xiàng)目-》屬性-》鏈接器-》逐用戶重定向--》設(shè)置為 true (該方案網(wǎng)上常見,但仍“未能”根本解決問題)
分析: 由于win7權(quán)限問題,所以出現(xiàn)問題3,需要通過使用命令提示符來幫助注冊該組件。
問題3:無法啟動(dòng)程序:“I:\VSProject\FirstCOM\Debug\FirstCOM.dll”。
解決:程序 --》 附件 --》 命令提示符,在”命令提示符“上點(diǎn)擊鼠標(biāo)右鍵,選擇”以管理員身份運(yùn)行“命令,這個(gè)時(shí)候?qū)⒋蜷_Dos命令窗口。
接下來輸入:regsvr32 “I:\VS Project\FirstCOM\Debug\FirstCOM.dll” (就是 regsvr32+.dll文件所在的完全路徑了,全路徑最好用引號括起來)
按Enter 鍵,就能夠注冊成功了。
下面簡單介紹如何調(diào)用COM組件。
1、在MFC中調(diào)用有一種很方便的方法,就是通過ClassWizard利用類型庫生成包裝類,不過有個(gè)前提就是com組件的接口必須是派生自IDispatch。
具體方法:
(1)VS2010新建一個(gè)MFC基于對話框程序,調(diào)出類向?qū)?,點(diǎn)擊“添加類”下拉菜單,選擇“類型庫中的MFC類”(From a type libarary)。
(2)選“注冊表”,然后在“可用類型庫”中定位到FirstCOMLib<1.0>,接下來會(huì)出來該庫中的所有接口,選擇你想生成的接口包裝類IFirstClass后點(diǎn)擊“完成”,向?qū)?huì)自動(dòng)生成相應(yīng)的.h文件,這樣你就可以在你的MFC工程中像使用普通類那樣使用COM組件了.
(3)代碼編寫:
首先引入頭文件 #include "CFirstClass.h"
為對話框程序添加一個(gè)“測試”按鈕,添加按鈕單擊響應(yīng)函數(shù)
關(guān)于m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",其實(shí)跟我們上一章中定義類時(shí)ProgID有關(guān),如果忘記,可以在FirstClass.rgs文件里找,rgs是組件注冊的腳本文件,當(dāng)你用 Regsvr32.exe注冊組件時(shí),組件內(nèi)部便是調(diào)用了這個(gè)文件。rgs文件是以資源的形式存于DLL內(nèi)的。
其中 CurVer=s'FirstCOM.math.1' 中的 FirstCOM.math.1 就是我們需要的那個(gè)字符串。
4)編譯運(yùn)行,點(diǎn)擊測試按鈕,結(jié)果如下:
2、在SDK中調(diào)用最簡單最常用的一種,用#import導(dǎo)入類型庫,利用VC提供的智能指針包裝類
VS2010創(chuàng)建Win32控制臺應(yīng)用程序,編寫如下代碼:
其中頭文件atlcomcli.h中定義了智能指針CComPtr。
聯(lián)系客服