VS2010 简单ATL COM开发

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;

[cpp]
view plain
copy
print
?

  1. #include "stdafx.h"
  2. #include "FirstClass.h"
  3. // CFirstClass
  4. STDMETHODIMP CFirstClass::Add(LONG para1, LONG para2, LONG* result)
  5. {
  6. // TODO: 在此添加实现代码
  7. *result = para1 + para2;
  8. return S_OK;
  9. }
#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: 未能注册输出。请尝试启用“逐用户重定向”,或者使用提升的权限从命令提示符处注册该组件。

解决:
项目-》属性-》链接器-》逐用户重定向--》设置为 true  (该方案网上常见,但仍“未能”根本解决问题)

分析: 由于win7权限问题,所以出现问题3,需要通过使用命令提示符来帮助注册该组件。

问题3:无法启动程序:“I:\VS Project\FirstCOM\Debug\FirstCOM.dll”。

解决:程序 --》 附件 --》 命令提示符,在”命令提示符“上点击鼠标右键,选择”以管理员身份运行“命令,这个时候将打开Dos命令窗口。

接下来输入:regsvr32   “I:\VS Project\FirstCOM\Debug\FirstCOM.dll”  (就是 regsvr32+.dll文件所在的完全路径了,全路径最好用引号括起来)

按 Enter 键,就能够注册成功了。

ATL COM 组件准备好了,下面我们来调用刚才的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"

为对话框程序添加一个“测试”按钮,添加按钮单击响应函数

[cpp]
view plain
copy
print
?


[cpp]
view plain
copy
print
?

  1. void CFirstCOMTestDlg::OnBnClickedButton1()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. CoInitialize(NULL);
  5. CFirstClass m_mymath;
  6. if (!m_mymath.CreateDispatch(_T("FirstCOM.math.1")))//创建COM对象:这里的字符串一定要和注册表中的ProgID一致!!!
  7. {
  8. MessageBox(_T("创建COM组件失败:请检查ProgID是否正确,组件是否已经注册"));
  9. return;
  10. }
  11. else
  12. {
  13. long ret = m_mymath.Add(1,2);//调用COM接口
  14. CString strTemp;
  15. strTemp.Format(_T("%d"),ret);
  16. MessageBox(strTemp);
  17. }
  18. CoUninitialize();
  19. }
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内的。

[cpp]
view plain
copy
print
?

  1. HKCR
  2. {
  3. FirstCOM.math.1 = s ‘FirstClass Class‘
  4. {
  5. CLSID = s ‘{C56D80DE-DA4C-4731-81A6-48B8D0BDB2FD}‘
  6. }
  7. FirstCOM.math = s ‘FirstClass Class‘
  8. {
  9. CurVer = s ‘FirstCOM.math.1‘
  10. }
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控制台应用程序,编写如下代码:

[cpp]
view plain
copy
print
?

  1. #include "stdafx.h"
  2. #include "atlcomcli.h"
  3. #import "FirstCOM.dll" no_namespace
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. CoInitialize(NULL);
  7. CLSID clsid;
  8. CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);
  9. CComPtr<IFirstClass> pFirstClass;//智能指针
  10. pFirstClass.CoCreateInstance(clsid);
  11. long ret = pFirstClass->Add(1,2);
  12. printf("%d\n",ret);
  13. pFirstClass.Release();
  14. CoUninitialize();
  15. return 0;
  16. }
#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组件

时间: 2024-11-02 21:23:12

VS2010 简单ATL COM开发的相关文章

c++简单的ATL COM开发和调用实例

1.打开VS2010,新建ATL COM 项目,步骤:"文件" -->"新建" -->"项目",选择"Visual C++" -->"ATL 项目" ,填写"名称" FirstCOM -->"确定". 2.ATL 项目向导,勾选 [支持COM+ 1.0]和[支持部件注册器],其他默认,点击完成. 3.切换到类视图,右键单击项目"Fir

用VS2010创建三层架构开发模式及三层架构的研究

三层架构的研究 三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(DAL) BLL将USL与DAL隔开了,并且加入了业务规则 各层的作用 1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务. 2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建. 3:表

[转]微信公众平台开发(四) 简单回复功能开发

本文转自:http://www.cnblogs.com/mchina/p/3155072.html 一.简介 微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性.下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发. 二.思路分析 用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现. 关键代码如下: if($keyword=="你好"){ $contentStr

微信公众平台开发(四) 简单回复功能开发

原文地址:http://www.cnblogs.com/mchina/p/3155072.html 一.简介 微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性.下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发. 二.思路分析 用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现. 关键代码如下: if($keyword=="你好"){ $contentStr

简单的iOS开发实例

项目需求 写一个iPhone应用程序,要求可以输入名字,点击按钮后,会显示一段文字向输入的名字打招呼,例如输入“宝玉”,显示“你好,宝玉!” 需求分析 这是一个很简单的应用程序,包含一个文本输入框,一个文本显示框,一个按钮.输入名字到文本输入框,再点击按钮,这时文本显示框的文字就会变成“你 好,<名字>!”.但是要注意,如果用户输入为空,要有警告提示用户重新输入:如果用户输入文字太长,超过16个字符,要自动截断. 产品设计 根据项目需求,画出相应的产品原型图: 初始状态 初始时,文本输入框为空

webpack4从零配置搭建简单的React16开发环境

写在最前 暑假想要学习React, 发现React官网上的没有说明如何搭建React开发环境, 网上找的很多都是基于webpack3的, 或者直接使用脚手架, 所以趁着放假, 就稍微学了下webpack, 开始搭建自己的React项目. 第一次写博客, 如有错误, 请指出, 谢谢! 之后也会继续更新从零搭建React全家桶系列, react+react-router+redux+es6. 希望大家多多支持. 说明 开发环境是windows 10 技术栈版本 node 10.3.0 npm 6.1

ATL(COM) 开发下 -- VS2010

前面一章介绍了怎么创建ATL COM组件及注册,下面简单介绍如何调用COM组件. 1.在MFC中调用有一种很方便的方法,就是通过ClassWizard利用类型库生成包装类,不过有个前提就是com组件的接口必须是派生自IDispatch.具体方法:(1)VS2010新建一个MFC基于对话框程序,调出类向导,点击“添加类”下拉菜单,选择“类型库中的MFC类”(From a type libarary). (2)选“注册表”,然后在“可用类型库”中定位到FirstCOMLib<1.0>,接下来会出来

Cocos2d-x观察者模式其实很简单--之游戏开发《赵云要格斗》(13)

这里是Evankaka的博客,欢迎大家前来讨论与交流------        转载请注明出处http://blog.csdn.net/evankaka 本文主要详细讲解了设计模式中的观察都模式及其在Coco2d-x的简单应用,最后,结合游戏中的技能冷却类放大招进行了一个使用. cocos2d-x版本:2.2.5 工程环境:windows7+VS2010 打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开 先来看看效果: 本文效果: 一.观察者模式简介 观察者模式

Vs2010 配置驱动的开发环境

我已被用来VS2010开发环境,之前曾经与vs2010驱动的开发环境.重装系统,一次又一次的配置,找了好几篇文章,配置没有成功,在配置阶段突然成功了,直接把原来的驱动程序的配置文件将能够接管使用. 当然首先: 打开(生成-->配置管理器) 并新建一个名称为"Dirver"的解决方式配置 从此处复制设置:debug. 此时会在project文件夹下成成一个配置文件. 将以下内容拷贝到配置文件里,关闭project又一次打开就可以. <?xml version="1.