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控制台应用程序。编写例如以下代码:

 

 

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

最新文章

  1. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)
  2. Atitit 软件项目非法模块与功能的管理与 &#160;监狱管理的对比 原理与概论attilax总结
  3. symfony中twig的模板变量与注释
  4. 高质量CSS编写规范
  5. http server v0.1_http_webapp.c
  6. 命令行利器Tmux
  7. array_column php 函数 自定义版本 php_version&lt;5.5
  8. Android开发学习之TypedArray类
  9. Raphael的transform用法
  10. 用户输入与while循环
  11. 【Alpha】第三次Daily Scrum Meeting
  12. linux cpu load学习笔记
  13. LeetCode 216. Combination Sum III (组合的和之三)
  14. mac 系统安装 eclipse 方法
  15. 小米google play service停止工作解决办法,不root,不刷第三方recovery(也适用于其他的手机)
  16. 201421123042 《Java程序设计》第13周学习总结
  17. centos7个人shell编写环境
  18. gjt常用命令---chalee
  19. 【IDEA填坑】springboot整合ssm框架
  20. Java - 31 Java 发送邮件

热门文章

  1. :工厂模式1:方法模式--Pizza
  2. MeshLab 编译
  3. dubbo-admin 无法支持JDK1.8
  4. tensorflow-LSTM-网络输出与多隐层节点
  5. 分布式ID设计方案
  6. L249 语法
  7. 虚拟机提示:无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件
  8. 临时调用call()与apply()方法
  9. git 服务器安装流程
  10. iOS原生和React-Native之间的交互1