当前位置:网络安全 > vs2010 simple atl_VS2010简单ATL COM开发(一)

vs2010 simple atl_VS2010简单ATL COM开发(一)

  • 发布:2023-10-08 03:58

ATL,Active Template Library活动模板库,编写COM组件的工具

使用Visual C++ 6.0 ATL COM组件开发流程:

1。打开vs2010,新建ATL COM项目,如图1

2。勾选【支持COM+1.0】和【支持组件注册器】

3 添加了com项目,右键项目名称,添加类,如下图

然后打开以下窗口并选择ATL简单对象。

然后会出现以下窗口。在缩写栏中输入类名 FirstClass。其他输入框将自动填写,然后单击“完成”。如果出现【是否覆盖现有文件】的提示,点击【是】。

最好指定progID,方便访问。

4。切换到类视图(View -> Class View),选择刚刚添加的接口IFirstClass,如下图,然后右键【Add】àAdd Method。

打开添加方法向导,如下,输入方法名称【添加】,在下方添加参数。

首先添加两个输入参数:勾选[in],选择参数类型LONG,输入参数名称para1,点击添加。执行同样的操作添加参数para2。

然后添加返回参数:勾选【retval】,选择参数类型LONG*,输入参数名结果,点击添加。

单击完成。如果单击“下一步”,将打开以下窗口。如果不需要填写信息,直接点击完成即可。

5。切换到Solution Explorer,打开IDL定义文件FirstCom.idl,看到下面的代码,就是定义的COM方法。

接口 IFirstClass : IDispatch{

??????[id(1)] HRESULT Add([in] LONG para1, [in] LONG para2, [out,retval] LONG*结果);

};

[

??????uuid(77067637-4F17-4CBB-A12B-28979A8D21FB),

?????????版本(1.0),

??????定制(a817e7a1-43fa-11d0-9e44-00aa00b6770a,“{CB407CA1-C9ED-4A94-B505-91212F94FCED}”)

]

6。打开FirstClass.cpp,编辑方法逻辑如下:

?

//头等舱

STDMETHODIMP? CFirstClass::Add(LONGpara1, long para2, LONG* 结果)

{

?????????// TODO: 在此添加实现代码

??????*结果 = para1 + para2;

??????返回S_OK;

}

?

7。至此,COM编写完成,编译成dll,并自动注册到系统中。我们来调用我们刚才写的COM,打开一个WPF项目,右键点击项目文件,选择【添加引用】,打开添加引用对话框,切换到COM选项卡,发现我们写的COM已经在这里了,单击“确定”。

?

如果在COM选项卡中没有看到它,请手动注册COM DLL,打开cmd,然后使用Regsvr32注册它。打开WPF项目的reference文件夹,如下图。您刚刚添加的参考已经在这里。

?

8。使用WPF程序调试COM,编写代码如下:

公共分部类 MainWindow : Window

??? {

??????public MainWindow()

??????? {

?????????InitializeComponent();

?????????FirstComLib.FirstClassClass firstClass = new FirstComLib.FirstClassClass();

?????????int ret = firstClass.Add(1, 5);

??????? }

??? }

测试发现ret=6,调试成功~!

转载自:http://www.sychzs.cn/xiaokang088/archive/2011/05/16/2047376.html

1。打开VS2010,新建一个ATL COM项目,步骤:“文件”-->“新建”-->“项目”,选择“Visual C++”-->“ATL项目”,填写“名称”FirstCOM - - “当然”。

2。对于ATL项目Confluence,勾选[Support COM+ 1.0]和[Support Component Registrar],其他保持默认,然后单击Finish。

3。切换到类视图,右键单击项目“FirstCOM”-->“添加”-->“类”。

4。选择“ATL”-->“ATL 简单对象”-->“添加”。

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

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

7。添加方法向导,在“方法名称”下输入Add。添加两个输入参数:勾选[in],选择参数类型LONG,输入参数名称para1,点击“添加”。以同样的方式添加参数para2。然后添加返回参数:首先选择参数类型LONG*,然后勾选【retval】,输入参数名结果,点击添加。只需单击“完成”即可。如果点击“下一步”,则无需填写信息,直接点击“完成”即可。

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* 结果)

{

// TODO:在此处添加实现代码

*结果 = para1 + para2;

返回S_OK;

}

10。编译运行,会生成dll文件并自动注册到系统中。

问题与解决方案

问题1:我在Win64位系统下编译,出现错误:无法打开预编译头文件:“Debug\FirstCOM.pch”:没有这样的文件或目录。

解决办法:右键你创建的工程,选择“属性”,弹出“FirstCOM属性页”,展开左侧“配置属性”->展开“C/C++”->选择“预编译头” ”,在右侧“预编译头”下拉菜单中选择“不使用预编译头文件”,点击“确定”按钮退出。

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

如果您想了解更多,可以参考博客:无法打开包含文件:“Stdfx.h”

问题2:解决问题1后,又出现错误:错误MSB8011:无法注册输出。尝试启用每用户重定向或使用提升的权限从命令提示符注册组件。

解决方案:

项目-》属性-》链接器-》每用户重定向--》设置为“true??” (这种方案网上很常见,但还是“未能”从根本上解决问题)

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

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

解决办法:程序--》附件?--》命令提示符,右键单击“命令提示符”,选择“以管理员身份运行”命令。此时,Dos命令窗口将会打开。

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

按确认键注册成功。

ATL COM组件已经准备好了,我们现在调用一下COM。

1。打开VS2010,新建一个ATL COM项目,步骤:“文件”-->“新建”-->“项目”,选择“Visual C++”-->“ATL项目”,填写“名称”FirstCOM - - “当然”。

2。对于ATL项目Confluence,勾选[Support COM+ 1.0]和[Support Component Registrar],其他保持默认,然后单击Finish。

3。切换到类视图,右键单击项目“FirstCOM”-->“添加”-->“类”。

4。选择“ATL”-->“ATL 简单对象”-->“添加”。

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

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

7。添加方法向导,在“方法名称”下输入Add。添加两个输入参数:勾选[in],选择参数类型LONG,输入参数名称para1,点击“添加”。以同样的方式添加参数para2。然后添加返回参数:首先选择参数类型LONG*,然后勾选【retval】,输入参数名结果,点击添加。只需单击“完成”即可。如果点击“下一步”,则无需填写信息,直接点击“完成”即可。

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* 结果)

{

// TODO:在此处添加实现代码

*结果 = para1 + para2;

返回S_OK;

}

10。编译运行,会生成dll文件并自动注册到系统中。

问题与解决方案

问题1:我在Win64位系统下编译,出现错误:无法打开预编译头文件:“Debug\FirstCOM.pch”:没有这样的文件或目录。

解决办法:右键你创建的工程,选择“属性”,弹出“FirstCOM属性页”,展开左侧“配置属性”->展开“C/C++”->选择“预编译头” ”,在右侧“预编译头”下拉菜单中选择“不使用预编译头文件”,点击“确定”按钮退出。

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

如果您想了解更多,可以参考博客:无法打开包含文件:“Stdfx.h”

问题2:解决问题1后,又出现错误:错误MSB8011:无法注册输出。尝试启用每用户重定向或使用提升的权限从命令提示符注册组件。

解决方案:

项目-》属性-》链接器-》每用户重定向--》设置为“true??” (这种方案网上很常见,但还是“未能”从根本上解决问题)

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

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

解决办法:程序--》附件?--》命令提示符,右键单击“命令提示符”,选择“以管理员身份运行”命令。此时,Dos命令窗口将会打开。

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

按确认键注册成功。

ATL COM组件已经准备好了,我们现在调用一下COM。

相关文章

最新资讯