一、創建ATL工程
1、創建ATL項目,取名為ATLMyCom

2、在ATL項目向導中,勾選【支持MFC】(利用MFC測試用)、【支持 COM+ 1.0】,其余的選項默認,點擊完成。

3、右鍵工程名稱,選擇添加類,接下來選擇【ATL簡單對象】。


4、在【ATL簡單對象向導】對話框中填入自己定義的類名,然后直接點擊完成。

5、切換到類視圖,為剛剛添加的接口IMyATLClass添加方法

6、現在來添加2個方法,分別用來計算兩個數之和和彈出MFC對話框,填寫方法名務必確定in(輸入)還是out(輸出) 返回指針要是retval。



7、切換到【解決方案資源管理器】,在ATLMyCom.idl文件中可以看到Sum和PopupDialog的定義。

8、打開MyATLClass.cpp,實現添加的兩個方法。
STDMETHODIMP CMyATLCLass::Sum(LONG param1, LONG param2, LONG* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your implementation code here *pVal = param1 + param2; return S_OK; } STDMETHODIMP CMyATLCLass::PopupDialog(CHAR* pstr) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your implementation code here
CString str(pstr);
AfxMessageBox((LPCTSTR)str);
return S_OK; }
9、Build該工程,得到ATLMyCom.dll並在注冊表中注冊。



二、測試ATL組件
1、在上面的工程中添加測試項目。

2、添加用於測試的MFC工程TestATL。

3、運行MFC應用程序向導,為簡單起見,選擇對話框工程,其余默認,點擊完成。

4、將生成的對話框中【確定】修改為Sum、【取消】按鈕修改為PopupDialog。

5、雙擊上面的按鈕,在系統生成的函數里刪除掉代碼CDialogEx::OnBnClickedSum;如下。
void CTestATLDlg::OnBnClickedSum() { // TODO: Add your control notification handler code here } void CTestATLDlg::OnBnClickedPopup() { // TODO: Add your control notification handler code here }
6、在TestATL工程中引入由MyATL工程中生成的“ATLMyCom_i.h”、“ATLMyCom_i.c”(這個文件主要用來查看CLSID_MyATLClass和IID_IMyATLClass的值),並在TestATLDlg.cpp中添加ATLMyCom_i.h的引用。
#include "..\ATLMyCom\ATLMyCom_i.h" #include "..\ATLMyCom\ATLMyCom_i.c"
7、實現Sum按鈕的響應方法。
void CTestATLDlg::OnBnClickedSum() { // TODO: Add your control notification handler code here HRESULT hr = S_OK; hr = CoInitialize(NULL);
IMyATLClass* pMyATLClass = NULL;
hr = CoCreateInstance(CLSID_MyATLCLass, NULL, CLSCTX_INPROC_SERVER,__uuidof(IMyATLCLass), (void **)&pMyATLClass);
int sum = 0;
pMyATLClass->Sum(2, 3, (LONG*)&sum);
CString str;
str.Format(L"%d",sum);
AfxMessageBox((LPCTSTR)str);
pMyATLClass->Release();
CoUninitialize();
} void CTestATLDlg::OnBnClickedPopup() { // TODO: Add your control notification handler code here HRESULT hr = S_OK; hr = CoInitialize(NULL); IMyATLClass* pMyATLClass = NULL;
hr = CoCreateInstance(CLSID_MyATLCLass, NULL, CLSCTX_INPROC_SERVER,__uuidof(IMyATLCLass), (void **)&pMyATLClass); pMyATLClass->PopupDialog("test ATL"); pMyATLClass->Release(); CoUninitialize(); }
運行測試:
COM組件編譯選項(保證在第三方電腦上沒有VS運行環境也能正常運行)


測試工程:


結果:

