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

测试工程:

结果:

    

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

VS2012创建ATL工程及使用MFC测试COM组件的更多相关文章

  1. spring 学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

    spring学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试 ioc 概念 控制反转(Inversion of Control,缩写为IOC),是面向 ...

  2. Maven创建Web工程并执行构建/测试/打包/部署

    创建工程基本参考上一篇Java Application工程,不同的是命令参数变了,创建Web工程的命令如下: mvn archetype:generate -DgroupId=com.jsoft.te ...

  3. VS2012与VS2015同时安装用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No such file or directory”的解决办法

    在WIndows 7操作系统上同时安装VS2012与VS2015并用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No ...

  4. C++基于ATL工程编写ActiveX控件步骤

    参考网址: https://blog.csdn.net/whui19890911/article/details/8896554 开发环境:VS2010 开发工程:C++ATL项目 开发目的:创建Ac ...

  5. Android:创建Android工程

    创建Android工程,在Eclipse左栏右键 new->project..   (版本不一样,名字会有所区别) 然后选择Android下的Android application projec ...

  6. 关于 VS2012 创建 MVC4 Empty 项目的一个小问题

    今天下午发现一个新建的项目工作异常,主要表现为应该返回JSON的Action没有返回JSON字符串,而是返回了JsonResult的对象名,即字符串“System.Web.Mvc.JsonResult ...

  7. 手把手教你解决无法创建 JPA 工程的问题

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7703803.html ------------------------------------ ...

  8. myeclipse创建hibernate工程

    1.创建数据库: from blog http://www.cnblogs.com/zhaocundang/p/9061959.html 使用navicat mysql IDE: 创建数据库 book ...

  9. IntelliJ IDEA2017创建web工程并实现远程部署tomca【转载】

    [IntelliJ IDEA2017创建web工程并实现远程部署tomcat] 作者:https://segmentfault.com/a/1190000012762629 将应用打成war包方式 步 ...

随机推荐

  1. “0x00,0x08”两个十六进制字符串,转换为整形

    int m_length=0;char buf[2]=={0x00,0x08};memcpy(&m_length,&buf[0],2); m_length=m_length<&l ...

  2. MyBatis基础入门《十二》删除数据 - @Param参数

    MyBatis基础入门<十二>删除数据 - @Param参数 描述: 删除数据,这里使用了@Param这个注解,其实在代码中,不使用这个注解也可以的.只是为了学习这个@Param注解,为此 ...

  3. JavaScript 字符串replace全局替换

    一般使用replace let str = "2018-8-14"; str.replace('-','/')//2018/8-14 并没有替换第二个”-“, 所以我们用正则表达式 ...

  4. Jenkins实现自动化部署

    首先登录到服务器,目前我所使用的program-DEV环境所在服务器为:IP     登录密码为:密码 1.基础配置 检查所有环境变量: $ env 2.下载安装包安装 JDK:由于本机器已经安装,这 ...

  5. Yii GridView

  6. html5-文本属性

    /*p{color: red;width: 50%;text-align: center;background: blue;}p{text-align: end;}p{text-align: end; ...

  7. UITableView 的坑

    1.cell的view和contentView的区别 1.1 addSubView UITableViewCell实例上添加子视图,有两种方式:[cell addSubview:view]或[cell ...

  8. 利用python 数据分析入门,详细教程,教小白快速入门

    这是一篇的数据的分析的典型案列,本人也是经历一次从无到有的过程,倍感珍惜,所以将其详细的记录下来,用来帮助后来者快速入门,,希望你能看到最后! 需求:对obo文件进行解析,输出为json字典格式 数据 ...

  9. svn安装使用

    SVN安装使用 获取项目 1.首先新建文件夹.如:测试项目. 2.接着鼠标右键选择:SVN Checkout/SVN 检出 3.在出行的对话框中输入仓库地址.如:svn://198.021.262/2 ...

  10. TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

    TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络