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

[cpp] view plaincopy

#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文件,并自动注册到系统中。

下面简单介绍如何调用COM组件。

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

具体方法:

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

(2)选“注册表”,然后在“可用类型库”中定位到FirstCOMLib<1.0>,接下来会出来该库中的所有接口,选择你想生成的接口包装类IFirstClass后点击“完成”,向导会自动生成相应的.h文件,这样你就可以在你的MFC工程中像使用普通类那样使用COM组件了.

(3)代码编写:

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

为对话框程序添加一个“测试”按钮,添加按钮单击响应函数

[cpp] view plaincopy

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内的。

[cpp] view plaincopy

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)编译运行,点击测试按钮,结果如下:

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

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

[cpp] view plaincopy

#include "stdafx.h"

#include "atlcomcli.h"

#import "FirstCOM.dll" no_namespace

int _tmain(int argc, _TCHAR* argv[])

{

CoInitialize(NULL);

CLSID clsid;

CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);

CComPtr<IFirstClass> pFirstClass;//智能指针

pFirstClass.CoCreateInstance(clsid);

long ret = pFirstClass->Add(1,2);

printf("%d\n",ret);

pFirstClass.Release();

CoUninitialize();

return 0;

}

[cpp] view plaincopy

#include "stdafx.h"

#include "atlcomcli.h"

#import "FirstCOM.dll" no_namespace

int _tmain(int argc, _TCHAR* argv[])

{

CoInitialize(NULL);

CLSID clsid;

CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);

CComPtr<IFirstClass> pFirstClass;//智能指针

pFirstClass.CoCreateInstance(clsid);

long ret = pFirstClass->Add(1,2);

printf("%d\n",ret);

pFirstClass.Release();

CoUninitialize();

return 0;

}

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

c++简单的ATL COM开发和调用实例(转)的更多相关文章

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

    1.打开VS2010.新建ATL COM 项目.步骤:"文件" -->"新建" -->"项目",选择"Visual C ...

  2. C#开发和调用Web Service

    http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...

  3. VS2010 简单ATL COM开发

    http://blog.csdn.net/wangwenjing90/article/details/8771934#reply http://blog.csdn.net/wangwenjing90/ ...

  4. WCF服务开发与调用的完整示例

    WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...

  5. Windows 8 应用开发 - 异步调用

    原文:Windows 8 应用开发 - 异步调用     不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使 ...

  6. QuickWebApi:使用Lambada方式,完成对WebApi的开发和调用。

    QuickWebApi 目的:使用Lambada方式,完成对WebApi的开发和调用. 缘由:为了解耦服务和展现,将越来越多的使用WebApi提供各种服务:随着服务的细化,WebApi的接口将越来越多 ...

  7. 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

    注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...

  8. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  9. IOS 开发,调用打电话,发短信,打开网址

    IOS 开发,调用打电话,发短信,打开网址   1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString: ...

随机推荐

  1. ClassLoader工作机制

    阅读目录 一.ClassLoader概念 二.JVM平台提供三层classLoader 三.JVM加载class文件到内存有两种方式 四.ClassLoader加载类的过程 五.自定义类加载器 六.实 ...

  2. Tomcat配置JNDI数据源

    经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定-还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.百度上那么花花绿绿的太多了,一个也没成功!...本例使用的数据 ...

  3. CSS3 Transitions, Transforms和Animation使用简介与应用展示

    CSS3 Transitions, Transforms和Animation使用简介与应用展示 by zhangxinxu from http://www.zhangxinxu.com本文地址:htt ...

  4. 初次接触Object对象变量

    Object 变量存储为 32 位(4 个字节)的地址形式,其为对象的引用.利用 Set 语句,声明为 Object 的变量可以赋值为任何对象的引用. 第一次注意到还有个数据类型,帮助文件里只有上面这 ...

  5. Java:基础

    Hello World //HelloWorld.java文件 public class HelloWorld { public static void main(String[] args) { S ...

  6. python join和split和strip用法

    python join 和 split方法的使用,join用来连接字符串,split恰好相反,拆分字符串的. strip()为去除开头结尾指定的字符,空着时是去除空白字符\t,\n,\r意思 1.jo ...

  7. algorithm: heap sort in python 算法导论 堆排序

    An Python implementation of heap-sort based on the detailed algorithm description in Introduction to ...

  8. htmlcss笔记--a

    a标签 1.下载:href里面放一个文件或者压缩包时,会下载: 2.锚点:跳转到锚点: href="#id" 跳转到的模块添加一个id,点击id就会跳转到该模块. html标签: ...

  9. shell文件/路径处理

    #在此加上是不是目录的判断. if [ "`ls -A $dir`" = "" ]; then echo "$dir is empty" e ...

  10. 总结与学习DIV+CSS网页布局技巧

    以前用表格布局时设置网页居中非常方便,把表格对齐方式设置为居中就行了,就这么简单,现在呢,用DIV+CSS样式表控制,好像不是那么容易了,其实也很简单,只不过方式不同而已. <style> ...