VS2012创建ATL工程及使用MFC测试COM组件

时间:2021-02-12 23:20:16

一、创建ATL工程

1、创建ATL项目,取名为ATLMyCom

VS2012创建ATL工程及使用MFC测试COM组件

2、在ATL项目向导中,勾选【支持MFC】(利用MFC测试用)、【支持 COM+ 1.0】,其余的选项默认,点击完成。

VS2012创建ATL工程及使用MFC测试COM组件

3、右键工程名称,选择添加类,接下来选择【ATL简单对象】。

VS2012创建ATL工程及使用MFC测试COM组件

VS2012创建ATL工程及使用MFC测试COM组件

4、在【ATL简单对象向导】对话框中填入自己定义的类名,然后直接点击完成。

VS2012创建ATL工程及使用MFC测试COM组件

5、切换到类视图,为刚刚添加的接口IMyATLClass添加方法

VS2012创建ATL工程及使用MFC测试COM组件

6、现在来添加2个方法,分别用来计算两个数之和和弹出MFC对话框,填写方法名务必确定in(输入)还是out(输出) 返回指针要是retval。

VS2012创建ATL工程及使用MFC测试COM组件

 

 VS2012创建ATL工程及使用MFC测试COM组件

 

VS2012创建ATL工程及使用MFC测试COM组件

7、切换到【解决方案资源管理器】,在ATLMyCom.idl文件中可以看到Sum和PopupDialog的定义。

VS2012创建ATL工程及使用MFC测试COM组件

 

 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并在注册表中注册。

VS2012创建ATL工程及使用MFC测试COM组件

VS2012创建ATL工程及使用MFC测试COM组件

VS2012创建ATL工程及使用MFC测试COM组件

 

二、测试ATL组件

1、在上面的工程中添加测试项目。

VS2012创建ATL工程及使用MFC测试COM组件

2、添加用于测试的MFC工程TestATL。

VS2012创建ATL工程及使用MFC测试COM组件

3、运行MFC应用程序向导,为简单起见,选择对话框工程,其余默认,点击完成。

VS2012创建ATL工程及使用MFC测试COM组件

4、将生成的对话框中【确定】修改为Sum、【取消】按钮修改为PopupDialog。

VS2012创建ATL工程及使用MFC测试COM组件

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运行环境也能正常运行)

VS2012创建ATL工程及使用MFC测试COM组件

VS2012创建ATL工程及使用MFC测试COM组件

测试工程:

VS2012创建ATL工程及使用MFC测试COM组件

VS2012创建ATL工程及使用MFC测试COM组件

结果:

VS2012创建ATL工程及使用MFC测试COM组件    VS2012创建ATL工程及使用MFC测试COM组件

 

VS2012创建ATL工程及使用C++测试COM组件