首页 > 编程语言 > 详细

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

时间:2019-04-20 16:13:47      阅读:173      评论:0      收藏:0      [点我收藏+]

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

  1. #include?"stdafx.h"??#include?"FirstClass.h"????
  2. //?CFirstClass????
  3. STDMETHODIMP?CFirstClass::Add(LONG?para1,?LONG?para2,?LONG*?result)????
  4. {????
  5. ????//?TODO:?在此加入实现代码????
  6. ?????*result?=?para1?+?para2;????
  7. ???return?S_OK;????
  8. }????


?

10、编译执行,会生成dll文件。并自己主动注冊到系统中。

?

问题及解决方法

问题1:我在Win64位系统中编译的,出现错误:无法打开预编译头文件:“Debug\FirstCOM.pch”:No such file or directory。

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

原因分析:编译器一般都是以文件为单位进行编译,假设改动了project中的一个文件。那么将导致全部文件都要又一次编译,这种编译将耗费非常长时间。为了提高编译速度,将那些不常被改动,比較稳定,文件单独包括到一个指定的头文件中。然后生成一个预编译头文件 *.pch 。?VC++中默认的头文件为 stdAfx.h。 但光有头文件无法编译,所以还要用到StdAfx.cpp,StdAfx.cpp里仅仅包括一句有效代码,这样编译时。通过编译 stdAfx.cpp就把大部分系统头文件编译进来。 Debug文件夹下便会产生一个 存储了预编译信息的 *.pch 文件。

假设 *.pch文件损坏或者不存在。就会出现“问题1”所看到的的无法打开预编译头文件的错。

如需深究。可參考博客:无法打开包括文件:“Stdfx.h”

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

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

分析: 因为win7权限问题。所以出现故障3。须要通过使用命令提示符来帮助注冊该组件。

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

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

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

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

技术分享图片

?

?

以下简介怎样调用COM组件。

1、在MFC中调用有一种非常方便的方法,就是通过ClassWizard利用类型库生成包装类,只是有个前提就是com组件的接口必须是派生自IDispatch。


详细方法:
(1)VS2010新建一个MFC基于对话框程序。调出类向导,点击“加入类”下拉菜单,选择“类型库中的MFC类”(From?a?type?libarary)。

(2)选“注冊表”,然后在“可用类型库”中定位到FirstCOMLib<1.0>,接下来会出来该库中的全部接口,选择你想生成的接口包装类IFirstClass后点击“完毕”。向导会自己主动生成对应的.h文件,这样你就能够在你的MFCproject中像使用普通类那样使用COM组件了.
(3)代码编写:

首先引入头文件 ??#include "CFirstClass.h"

为对话框程序加入一个“測试”button,加入button单击响应函数

?

  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. }????


?

关于m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",事实上跟我们上一章中定义类时ProgID有关,假设忘记,能够在FirstClass.rgs文件中找。rgs是组件注冊的脚本文件,当你用 Regsvr32.exe注冊组件时,组件内部便是调用了这个文件。rgs文件是以资源的形式存于DLL内的。

?

  1. KCR????
  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. ????}????


?

当中 CurVer=s‘FirstCOM.math.1‘ 中的?FirstCOM.math.1?就是我们须要的那个字符串。

?

4)编译执行,点击測试button。结果例如以下:

技术分享图片

?

2、在SDK中调用最简单最经常使用的一种,用#import导入类型库,利用VC提供的智能指针包装类

VS2010创建Win32控制台应用程序。编写例如以下代码:

?

?

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

当中头文件atlcomcli.h中定义了智能指针CComPtr。

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

原文:https://www.cnblogs.com/xfgnongmin/p/10741219.html

(0)
(0)
   
举报
评论 一句话评论(0
分享档案
最新文章
教程昨日排行
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!