前面一章介紹了怎么創(chuàng)建ATL COM組件及注冊,下面簡單介紹如何調(diào)用COM組件。
1、在MFC中調(diào)用有一種很方便的方法,就是通過ClassWizard利用類型庫生成包裝類,不過有個前提就是com組件的接口必須是派生自IDispatch。
具體方法:
(1)VS2010新建一個MFC基于對話框程序,調(diào)出類向?qū)?,點擊“添加類”下拉菜單,選擇“類型庫中的MFC類”(From a type libarary)。
(2)選“注冊表”,然后在“可用類型庫”中定位到FirstCOMLib<1.0>,接下來會出來該庫中的所有接口,選擇你想生成的接口包裝類IFirstClass后點擊“完成”,向?qū)詣由上鄳?yīng)的.h文件,這樣你就可以在你的MFC工程中像使用普通類那樣使用COM組件了.
(3)代碼編寫:
首先引入頭文件 #include "CFirstClass.h"
為對話框程序添加一個“測試”按鈕,添加按鈕單擊響應(yīng)函數(shù)
- void CFirstCOMTestDlg::OnBnClickedButton1()
- {
- // TODO: 在此添加控件通知處理程序代碼
- CoInitialize(NULL);
- CFirstClass m_mymath;
- if (!m_mymath.CreateDispatch(_T("FirstCOM.math.1")))//創(chuàng)建COM對象:這里的字符串一定要和注冊表中的ProgID一致!!!
- {
- MessageBox(_T("創(chuàng)建COM組件失敗:請檢查ProgID是否正確,組件是否已經(jīng)注冊"));
- return;
- }
- else
- {
- long ret = m_mymath.Add(1,2);//調(diào)用COM接口
- CString strTemp;
- strTemp.Format(_T("%d"),ret);
- MessageBox(strTemp);
- }
- CoUninitialize();
- }
關(guān)于m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",其實跟我們上一章中定義類時ProgID有關(guān),如果忘記,可以在FirstClass.rgs文件里找,rgs是組件注冊的腳本文件,當(dāng)你用 Regsvr32.exe注冊組件時,組件內(nèi)部便是調(diào)用了這個文件。rgs文件是以資源的形式存于DLL內(nèi)的。
- HKCR
- {
- FirstCOM.math.1 = s 'FirstClass Class'
- {
- CLSID = s '{C56D80DE-DA4C-4731-81A6-48B8D0BDB2FD}'
- }
- FirstCOM.math = s 'FirstClass Class'
- {
- CurVer = s 'FirstCOM.math.1'
- }
其中 CurVer=s'FirstCOM.math.1' 中的
FirstCOM.math.1 就是我們需要的那個字符串。
(4)編譯運行,點擊測試按鈕,結(jié)果如下:
2、在SDK中調(diào)用最簡單最常用的一種,用#import導(dǎo)入類型庫,利用VC提供的智能指針包裝類
VS2010創(chuàng)建Win32控制臺應(yīng)用程序,編寫如下代碼:
- #include "stdafx.h"
-
- #include "atlcomcli.h"
- #import "FirstCOM.dll" no_namespace
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- CoInitialize(NULL);
- CLSID clsid;
- CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);
- CComPtr<IFirstClass> pFirstClass;//智能指針
- pFirstClass.CoCreateInstance(clsid);
- long ret = pFirstClass->Add(1,2);
- printf("%d\n",ret);
- pFirstClass.Release();
- CoUninitialize();
-
- return 0;
- }
其中頭文件atlcomcli.h中定義了智能指針CComPtr。
運行結(jié)果:
還有一些調(diào)用COM組件的方法,參見VC調(diào)用COM組件。