前面一章介紹了怎麼創建ATL COM組件及註冊,下面簡單介紹如何調用COM組件。
1、在MFC中調用有一種很方便的方法,就是通過ClassWizard利用類型庫生成包裝類,不過有個前提就是com組件的接口必須是派生自IDispatch。
具體方法:
(1)VS2010新建一個MFC基於對話框程序,調出類嚮導,點擊“添加類”下拉菜單,選擇“類型庫中的MFC類”(From a type libarary)。
(2)選“註冊表”,然後在“可用類型庫”中定位到FirstCOMLib<1.0>,接下來會出來該庫中的所有接口,選擇你想生成的接口包裝類IFirstClass後點擊“完成”,嚮導會自動生成相應的.h文件,這樣你就可以在你的MFC工程中像使用普通類那樣使用COM組件了.
(3)代碼編寫:
首先引入頭文件 #include "CFirstClass.h"
爲對話框程序添加一個“測試”按鈕,添加按鈕單擊響應函數
void CFirstCOMTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 CoInitialize(NULL); CFirstClass m_mymath; if (!m_mymath.CreateDispatch(_T("FirstCOM.math.1")))//創建COM對象:這裏的字符串一定要和註冊表中的ProgID一致!!! { MessageBox(_T("創建COM組件失敗:請檢查ProgID是否正確,組件是否已經註冊")); return; } else { long ret = m_mymath.Add(1,2);//調用COM接口 CString strTemp; strTemp.Format(_T("%d"),ret); MessageBox(strTemp); } CoUninitialize(); }
關於m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",其實跟我們上一章中定義類時ProgID有關,如果忘記,可以在FirstClass.rgs文件裏找,rgs是組件註冊的腳本文件,當你用 Regsvr32.exe註冊組件時,組件內部便是調用了這個文件。rgs文件是以資源的形式存於DLL內的。
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)編譯運行,點擊測試按鈕,結果如下:
2、在SDK中調用最簡單最常用的一種,用#import導入類型庫,利用VC提供的智能指針包裝類
VS2010創建Win32控制檯應用程序,編寫如下代碼:
#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。
運行結果:
還有一些調用COM組件的方法,參見VC調用COM組件。