VS2010 简单ATL COM开发
http://blog.csdn.net/wangwenjing90/article/details/8771934#reply
http://blog.csdn.net/wangwenjing90/article/details/8772376
1、打开VS2010,新建ATL COM 项目,步骤:“文件” --》“新建” --》“项目”,选择“Visual C++” --》“ATL 项目” ,填写“名称” FirstCOM --》“确定”。
2、ATL 项目向导,勾选 【支持COM+ 1.0】和【支持部件注册器】,其他默认,点击完成。
3、切换到类视图,右键单击项目“FirstCOM”--》“添加” --》“类”。

4、选“ATL” --》“ATL 简单对象” --》“添加”。
5、ATL 简单对象向导,“简称”中输入类名称FirstClass,其他输入框会自动填写,最下面的“ProgID”没有自动填写,最好自己写上一个,如FirstCOM.math,否则后面无法正确调用组件,点击“完成”。如果出现提示【是否覆盖现有文件】,点击【是】即可。
6、切换到类视图,选中刚才添加的接口IFirstClass,如下,然后右键单击【添加】添加方法。

7、添加方法向导,在"方法名" 下输入Add。增加两个输入参数:勾选【in】,选择参数类型LONG,输入参数名para1,点击“添加”。同样操作增加参数para2。然后增加一个返回参数:先选择参数类型LONG*,再勾选【retval】,输入参数名result,点击添加。点击“完成”即可,如果点击下一步,不需要填写信息,点击“完成”即可。
8、切换到解决方案资源管理器,展开项目“源文件”, 双击 FirstCom.idl 打开IDL定义文件,看到如下代码,就是定义的COM方法了。

9、双击打开FirstClass.cpp 编辑代码:*result = para1 + para2;
- #include "stdafx.h"
- #include "FirstClass.h"
- // CFirstClass
- STDMETHODIMP CFirstClass::Add(LONG para1, LONG para2, LONG* result)
- {
- // TODO: 在此添加实现代码
- *result = para1 + para2;
- return S_OK;
- }
10、编译运行,会生成dll文件,并自动注册到系统中。
问题及解决方法
问题1:我在Win64位系统中编译的,出现错误:无法打开预编译头文件:“Debug\FirstCOM.pch”:No such file or directory。
解决:右键点击你创建的项目,选择“属性”,弹出“FirstCOM 属性页”,在左侧展开"配置属性"--》展开“C/C++”--》选中“预编译头”,在右边的“预编译头”下拉菜单中选择“不使用预编译头文件”,点击“确定”按钮退出。
原因分析:编译器一般都是以文件为单位进行编译,如果修改了工程中的一个文件,那么将导致所有文件都要重新编译,这样的编译将耗费很长时间。为了提高编译速度,将那些不常被修改,比较稳定,文件单独包含到一个指定的头文件中, 然后生成一个预编译头文件 *.pch 。 VC++中默认的头文件为 stdAfx.h, 但光有头文件无法编译,所以还要用到StdAfx.cpp,StdAfx.cpp里只包含一句有效代码,这样编译时,通过编译 stdAfx.cpp就把大部分系统头文件编译进来, Debug目录下便会产生一个 存储了预编译信息的 *.pch 文件。如果 *.pch文件损坏或者不存在,就会出现“问题1”所示的无法打开预编译头文件的错。
如需深究,可参考博客:无法打开包括文件:“Stdfx.h”
问题2:解决了问题1之后,又出现:error MSB8011: 未能注册输出。请尝试启用“逐用户重定向”,或者使用提升的权限从命令提示符处注册该组件。
问题3:无法启动程序:“I:\VS Project\FirstCOM\Debug\FirstCOM.dll”。
解决:程序 --》 附件 --》 命令提示符,在”命令提示符“上点击鼠标右键,选择”以管理员身份运行“命令,这个时候将打开Dos命令窗口。
接下来输入:regsvr32 “I:\VS Project\FirstCOM\Debug\FirstCOM.dll” (就是 regsvr32+.dll文件所在的完全路径了,全路径最好用引号括起来)


ATL COM 组件准备好了,下面我们来调用刚才的COM。
VS2010 简单ATL COM开发(下)
前面一章介绍了怎么创建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组件。
VS2010 简单ATL COM开发的更多相关文章
- c++简单的ATL COM开发和调用实例(转)
c++简单的ATL COM开发和调用实例 1.打开VS2010,新建ATL COM 项目,步骤:“文件” -->“新建” -->“项目”,选择“Visual C++” -->“ATL ...
- 用VS2010创建三层架构开发模式及三层架构的研究
三层架构的研究 三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(DAL) BLL将USL与DAL隔开了,并且加入了业务规则 各层的作用 1:数据数据访问层:主要是对 ...
- VS2010 简单实用快捷键
VS2010 简单实用快捷键 1). Ctrl+H: 替换 2). Ctrl+F: 查找 3). F5: 启动调试 4). CTRL + F7 生成编译 5). Ctrl+F5: 开始执行(不调试) ...
- Hibernate入门2.简单的项目开发实例
Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...
- 基于Django进行简单的微信开发
代码地址如下:http://www.demodashi.com/demo/11756.html 一.微信公众号的准备: 1. 注册 访问地址:https://mp.weixin.qq.com/ 按照提 ...
- 利用 Docker 构建一个简单的 java 开发编译环境
目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...
- c++简单的ATL COM开发和调用实例
1.打开VS2010.新建ATL COM 项目.步骤:"文件" -->"新建" -->"项目",选择"Visual C ...
- (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6
ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了. Active Service Page 和 Java Ser ...
- ASP.NET的简单与面向对象开发
ASP.NET开发,一开始是为了超赶时间完成任务,只能把功能实现即可.如下面一个功能,在网页中有一个铵钮,用户点一点切换网页的图片,再点一点又切换回来.我们要怎样做?在铵钮事件中去变更图片的路径即可. ...
随机推荐
- 探索Web Office Apps服务
老样子,先放几个官链: WOA部署规划:http://technet.microsoft.com/zh-cn/library/jj219435(v=office.15).aspx 拓扑规划:http: ...
- Android基础学习:Android环境搭建
在3年前,自学过Android的一些基础知识,但是那个时候Linux等其他的知识结构比较薄弱,理解得不是很深刻,后来因项目变动的原因,没有再搞Android相关的东西了.时过境迁,还是因为项目变动,重 ...
- springmvc 注解式开发 接收请求参数
1.校正请求参数名: 2.以对象形式整体接收 3.路径变量:
- 如何判断一个字符串是否是UTF8编码
UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中. ...
- css3(border-radius)边框圆角详解(转)
css3(border-radius)边框圆角详解 (2014-05-19 16:16:29) 转载▼ 标签: divcss html it css3 分类: 网页技术 传统的圆角生成方案,必须使用多 ...
- C++面向对象类的实例题目六
问题描述: 编写一个程序计算两个给定长方形的面积,其中在设计类成员函数addarea()(用于计算两个长方形的总面积)时使用对象作为参数. 程序代码: #include<iostream> ...
- 面试题:3年工作经验 已看1 有用 memcache和redis有什么区别
此内容偏中高级,适合有三年经验者. 1. java中wait和sleep有什么区别?多线程条件下如何保证数据安全? 答:最大区别是等待时wait会释放锁(乐观锁),而sleep会一直持有锁 ...
- PCL—点云滤波(初步处理)
博客转载自:http://www.cnblogs.com/ironstark/p/4991232.html 点云滤波的概念 点云滤波是点云处理的基本步骤,也是进行 high level 三维图像处理之 ...
- head first 设计模式 策略模式
HEAD FIRST:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 设计模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.本 ...
- 按位操作符(Bitwise operators)
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...