VS2012创建ATL工程及使用MFC测试COM组件
来源:互联网 发布:域名备案 百科 编辑:程序博客网 时间:2024/05/16 04:06
VS2012创建ATL工程及使用MFC测试COM组件
一、创建ATL工程
1、创建ATL项目,取名为MyATL
2、在ATL项目向导中,勾选【支持MFC】(利用MFC测试用)、【支持 COM+ 1.0】和【支持部件注册器】,其余的选项默认,点击完成。
3、右键工程名称,选择添加类,接下来选择【ATL简单对象】。
4、在【ATL简单对象向导】对话框中填入下面内容(可更改为自己喜欢的类名称),然后直接点击完成。
5、切换到类视图,为刚刚添加的接口IMyATLClass添加方法。
6、现在来添加2个方法,分别用来计算两个数之和和弹出MFC对话框。
7、切换到【解决方案资源管理器】,可以看到Sum和PopupDialog的定义。
将参数[in] LONG* sum修改为[out] LONG* sum,表示这是一个需要输出的值。
8、打开MyATLClass.cpp,实现添加的两个方法。
9、生成该工程,得到MyATL.dll并在注册表中注册。
二、测试ATL组件
1、在上面的工程中添加测试项目。
2、添加用于测试的MFC工程TestATL。
3、运行MFC应用程序向导,为简单起见,选择对话框工程,其余默认,点击完成。
4、将生成的对话框中【确定】、【取消】按钮修改如下。
5、双击上面的按钮,在系统生成的函数里删除掉代码CDialogEx::OnOK();如下。
6、在TestATL工程中引入由MyATL工程中生成的“MyATL_i.h”、“MyATL_i.c”(这个文件主要用来查看CLSID_MyATLClass和IID_IMyATLClass的值),并在TestATLDlg.cpp中添加MyATL_i.h的引用。
7、生成TestATL工程,会出现如下错误。
解决方法是右键“MyATL_i.c”->属性->C/C++->预编译头,将“使用(/Yu)”修改为“不使用预编译头”。
再次生成TestATL就不会报错了。
8、实现Sum按钮的响应方法。
9、将TestATL设置为启动项,在CoCreateInstance设置断点跟踪调试。启动应用后,点击Sum按钮,进入断点,在监视窗口看到clsid、iid是和CLSID_MyATLClass、IID_IMyATLClass一一对应的,这就说明在调用pTypeLib->GetTypeInfo的时候,其参数值index是正确的。
10、注释掉含有CLSID_MyATLClass那一行对CoCreateInstance的调用,添加对Sum的测试代码,调试运行在监视窗口可以看到运算结果。
11、添加对Popup Dialog的测试,过程略,结果如下。
考虑到编码问题,将MyATLClass.cpp中对PopupDialog的实现修改为:
重新生成MyATL,并启动TestATL测试如下。
12、再看pTypeLib->GetTypeInfo的调用。
程序中的调用是:
注意到其中index的值分别是2、3,表示第3、4个值。另外,
中nTypeInfoCount的值为4,这下就可以知道pTypeLib中前2个TypeInfo并不是所期望的,而第3、4个才是我们需要的,为什么会这样?
再次找到MyATL工程中的MyATL.idl文件,找到library MyATLLib的定义,
可以看到首先定义的是CompReg这个类,它使得生成的dll完成了在注册表中的注册,并且它的两部分也正是pTypeLib->GetTypeInfo的前两部分,因此GetTypeInfo的index就变成了2和3。
下面修改CompReg和MyATLClass类定义的顺序,
在调用pTypeLib->GetTypeInfo的时候,将参数设置为0、1,这时候也会成功运行。
最后,我们知道了在library MyATLLib中类定义的顺序决定了GetTypeInfo中index参数的值,注意不到这个问题,如果在接口自动化中随意写index参数的值,就会一直找不到方向,白白浪费时间。
附:
源码地址:网盘代码 | CSDN代码
参考出处:VS2010创建ATL工程及使用C++测试COM组件
- VS2012创建ATL工程及使用MFC测试COM组件
- VS2012创建ATL工程及使用MFC测试COM组件
- VS2012创建ATL工程及使用MFC测试COM组件
- 创建ATL工程及使用MFC测试COM组件
- VS2010创建ATL工程及使用C++测试COM组件
- 创建ATL工程及使用C++测试COM组件
- VS2010创建ATL工程及使用C++测试COM组件
- 用ATL创建COM组件及实例讲解
- 如何使用C++创建COM组件(ATL项目)
- vs2012创建空MFC工程
- [COM/ATL]组件、对象、MFC、ATL的区别
- VS2012&Qt使用COM组件
- 用ATL创建COM组件详细解说
- vs2010 用ATL创建com组件
- 用ATL创建COM组件详细解说
- 用ATL创建COM组件详细解说
- 用ATL创建COM组件详细解说
- 使用ATL开发简单COM组件(1)
- springboot实战之整合jsp模版引擎
- codeforces 26a(素数打表)
- 8.求1~200之间能被 7整除,但不能被4整除的整数。
- Java Socket 多线程简单入门案例
- Linux的基本指令
- VS2012创建ATL工程及使用MFC测试COM组件
- 汇总-oc
- 使用Quartz进行作业任务调度
- 如何解决段错误
- 9.输出10个斐波那契(Fibonacci)数列:1 1 2 3 5 8 13 21 34 55
- 哈夫曼树以及哈夫曼编码
- SpringMVC知识点总结(1)
- Python分析网易云音乐近5年热门歌单
- logsit回归代码的推导