c++简单的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
- #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++”--》选中“预编译头”。在右边的“预编译头”下拉菜单中选择“不使用预编译头文件”,点击“确定”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单击响应函数
- 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内的。
- KCR
- {
- 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)编译执行,点击測试button。结果例如以下:
2、在SDK中调用最简单最经常使用的一种,用#import导入类型库,利用VC提供的智能指针包装类
VS2010创建Win32控制台应用程序。编写例如以下代码:
当中头文件atlcomcli.h中定义了智能指针CComPtr。
c++简单的ATL COM开发和调用实例的更多相关文章
- c++简单的ATL COM开发和调用实例(转)
c++简单的ATL COM开发和调用实例 1.打开VS2010,新建ATL COM 项目,步骤:“文件” -->“新建” -->“项目”,选择“Visual C++” -->“ATL ...
- C#开发和调用Web Service
http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...
- VS2010 简单ATL COM开发
http://blog.csdn.net/wangwenjing90/article/details/8771934#reply http://blog.csdn.net/wangwenjing90/ ...
- WCF服务开发与调用的完整示例
WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...
- Windows 8 应用开发 - 异步调用
原文:Windows 8 应用开发 - 异步调用 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使 ...
- QuickWebApi:使用Lambada方式,完成对WebApi的开发和调用。
QuickWebApi 目的:使用Lambada方式,完成对WebApi的开发和调用. 缘由:为了解耦服务和展现,将越来越多的使用WebApi提供各种服务:随着服务的细化,WebApi的接口将越来越多 ...
- 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)
注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
- IOS 开发,调用打电话,发短信,打开网址
IOS 开发,调用打电话,发短信,打开网址 1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString: ...
随机推荐
- log4j的参数配置(转)
转载:log4j.properties文件各参数含义与配置 以下是配置文件log4j.properties的一些属性: log4j.rootLogger=WARN, stdout, Rlog4j. ...
- 18-10-18 Python 思维导图 很棒的
赠送 14 张 Python 知识点思维导图 来源 | Python学习联盟 本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库). 按顺序依次展示了以下内容的一系列思维导图: ...
- mysql 数据类型day43
数据类型 一数值类型 1 整数类型 默认是有符号的 unsigned 没有符号 zerofill0t 小整数 TINYINT [(m)] 1个字节 8bit 2**8 256 m 最多3位 最低 -1 ...
- ESP8266 问题
根据SDK接口编写的程序在运行一段时间,大约15/18分钟左右,就会报错 [22:30:55.828] there is no poison after the block. Expected poi ...
- shell脚本实例-shell 分析系统瓶颈脚本
#!/usr/bin/bash PS3="Your choice is: [10 for quit]" #检查是那个系统 os_check() { if [ -e /etc/red ...
- 2019-04-08-day027-网络编程基础
网络编程 基于同一台机器上的多个程序之间通信 可以基于文件 基于多台机器之间的通信 可以基于网络 web程序两种架构完成的: C/S :client(客户端) server(服务端) B/S :bro ...
- ajax异步上传图片(TP5)
直接上代码 PHP代码如下 /** * 上传 */ public function upload_photo(){ $file = $this->request->file('file') ...
- 最新2018年三月可用Windows10激活密钥
Windows 10 Edition Product Key Windows 10 Home TX9XD-98N7V-6WMQ6-BX7FG-H8Q99 Windows 10 Home Single ...
- [BUG]数据库日期格式, 到页面是毫秒值
springboot 配置文件
- HDU 4704 Sum(隔板原理+组合数求和公式+费马小定理+快速幂)
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description Sample Input 2 Sample Outp ...