vs2013 创建简单ATL COM组件并调用

本文参考自博主@九月丫头 https://blog.csdn.net/wangwenjing90/article/details/8771934

创建:

1、打开vs2013,新建【ATL项目】,这里命名“FirstATL”。

2、项目向导勾选【支持COM+1.0】以及【支持部件注册器】,然后完成。
在这里插入图片描述
3、切换到类视图,右键单击项目“FirstATL”–》“添加” --》“类”。

4、选“ATL” --》“ATL 简单对象” --》“添加”。
!!! 注意:后面在调用的时候,import可能会报错,可能需要在此处创建ATL COM+1.0组件。目前未尝试过 !!!

5、ATL 简单对象向导,“简称”中输入类名称FirstClass,其他输入框会自动填写,最下面的“ProgID”没有自动填写,最好自己写上一个,如FirstCOM.math,否则后面无法正确调用组件,点击“完成”。如果出现提示【是否覆盖现有文件】,点击【是】即可。

6、切换到类视图,选中刚才添加的接口IFirstClass,如下,然后右键单击【添加】添加方法。

7、添加方法向导,在"方法名" 下输入Add。增加两个输入参数:勾选【in】,选择参数类型LONG,输入参数名para1,点击“添加”。同样操作增加参数para2。然后增加一个返回参数:先选择参数类型LONG*,再勾选【retval】,输入参数名result,点击添加。点击“完成”即可。
在这里插入图片描述
8、切换到解决方案资源管理器,展开项目“源文件”, 双击 FirstATL.idl 打开IDL定义文件,看到如下代码,就是定义的COM方法了。
在这里插入图片描述
9、双击打开FirstClass.cpp 编辑代码:*result = para1 + para2;
在这里插入图片描述
10、编译运行,会生成dll文件,并自动注册到系统中。

问题及解决方法
问题1:出现错误:无法打开预编译头文件:“Debug\FirstATL.pch”:No such file or directory。

解决:右键点击你创建的项目,选择“属性”,弹出“FirstATL 属性页”,在左侧展开"配置属性"–》展开“C/C++”–》选中“预编译头”,在右边的“预编译头”下拉菜单中选择“不使用预编译头文件”,点击“确定”按钮退出。

原因分析:编译器一般都是以文件为单位进行编译,如果修改了工程中的一个文件,那么将导致所有文件都要重新编译,这样的编译将耗费很长时间。为了提高编译速度,将那些不常被修改,比较稳定,文件单独包含到一个指定的头文件中, 然后生成一个预编译头文件 *.pch 。 VC++中默认的头文件为 stdAfx.h, 但光有头文件无法编译,所以还要用到StdAfx.cpp,StdAfx.cpp里只包含一句有效代码,这样编译时,通过编译 stdAfx.cpp就把大部分系统头文件编译进来, Debug目录下便会产生一个 存储了预编译信息的 *.pch 文件。如果 *.pch文件损坏或者不存在,就会出现“问题1”所示的无法打开预编译头文件的错。

问题2:解决了问题1之后,又出现:error MSB8011: 未能注册输出。请尝试启用“逐用户重定向”,或者使用提升的权限从命令提示符处注册该组件。

解决: 项目-》属性-》链接器-》逐用户重定向–》设置为 true (该方案网上常见,但仍“未能”根本解决问题)
分析: 由于win7权限问题,所以出现问题3,需要通过使用命令提示符来帮助注册该组件。

问题3:无法启动程序:“F:\Zyh\vc++demo\FirstATL\Debug\FirstATL.dll”。

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

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

注册后,可通过在cmd输入“regedit”,打开注册表,在【HKEY_CLASSES_ROOT】下快速输入“FirstCOM.math”找到CurVer值和CLSID值。

调用:

创建win32程序,将前面生成的FirstATL.dll丢到当前工程目录下,然后使用如下代码:

// UseFirstATL2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "atlcomcli.h"

#import "FirstATL.dll" no_namespace


int _tmain(int argc, _TCHAR* argv[])
{
	CoInitialize(NULL);
	CLSID clsid;
	
	//根据给定的程序标识符,从注册表找出对应的类标识符("FirstCOM.math.1"为注册的CurVer值)
	CLSIDFromProgID(OLESTR("FirstCOM.math.1"), &clsid);
	//COM智能指针
	CComPtr<IFirstClass> pFirstClass;
	//用指定的泪标识符创建com对象
	pFirstClass.CoCreateInstance(clsid);

	//调用接口
	long ret = pFirstClass->Add(9, 11);
	printf("%d\n", ret);
	
	pFirstClass.Release();
	CoUninitialize();

	system("pause");
	return 0;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值