目录

1.     COM实践简介...2

2.     COM实践VC.2

2.1.     VC创建COM组件...2

2.2.     使用VC调用...5

2.3.     使用C#调用...8

3.     COM实践C#.9

3.1.     C#创建COM组件...9

3.2.     使用VC调用...12

3.3.     使用C#调用...14

1.COM实践简介

因需要对Office系列进行程序操作,特研究了一下COM相关的编程。

个人体会:COM面向接口编程,组件可复用,跨语言(限于微软系)。

关于COM组件描述,见百度百科:http://baike.baidu.com/view/185316.htm

COM学习书籍(网络PDF版很多):《COM技术内幕》、《COM编程精彩实例》。

本文章参考网络文档:《Com组件简单实现及调用方法.doc》。

原出处不详,可到百度文库下载:http://wenku.baidu.com/view/18d40164f5335a8102d220f8.html

开发工具:VS2005。

COM实践,着重于与VC与C#组件的互相调用。

实现分两方面:

Ø  VC与C#分别调VC COM组件。

Ø  VC与C#分别调C# COM组件。

下载本文档源码

2.COM实践VC
2.1.VC创建COM组件

1、  创建ATL工程,工程名为MyVCCom。

文件结构如下。

2、  新增ATL对象。

Short name设为MathAdd,其他自动填充。

3、  IMathAdd新增Add接口。

Class View视图右键IMathAdd->Add Method。

4、  CMathAdd实现Add接口。

Class View视图点击CMathAdd,双击Add函数。

实现代码如下。

STDMETHODIMP CMathAdd::Add(LONG num1, LONGnum2, LONG* num3)
{
// TODO: Add your implementation code here
*num3=num1+num2; return S_OK;
}

5、  编译COM组件会自动注册COM组件。

2.2. 使用VC调用

1、  新建VC工程,工程名为VCUseVC。

创建一个Win32空工程。

2、  新建cpp文件VCUseVC.cpp。

3、  将生成的MyVCCom.dll拷贝到工程目录和程序生成目录中。

4、  源码如下。

#include <iostream>
#import "MyVCCom.dll" no_namespace
using namespace std; void main(void)
{
HRESULT hr = S_OK;
long num1=1;
long num2 = 2;
long num3;
CoInitialize(NULL);//NULL换成0也可以 IMathAddPtr IMyComInVC(__uuidof(MathAdd));
num3 = IMyComInVC->Add(num1,num2);
cout<<"1+2=" << num3 << endl;//输出结果
IMyComInVC.Release();
IMyComInVC = NULL;
CoUninitialize();
}

5、  运行结果如下。

2.3. 使用C#调用

1、  创建工程名为CSharpUseVC的C#工程。

2、  添加引用。(即前面生成的MyVCCom组件)。

3、  按钮响应

       private void button1_Click(object sender, EventArgs e)
{
MyVCComLib.MathAdd comTest= new MyVCComLib.MathAdd();
//定义变量
int num1, num2, num3;
num1 = 1;
num2 = 2;
//调用COM组件的方法
num3=comTest.Add(num1, num2);
//弹出消息
MessageBox.Show("1+2=" +num3.ToString());
}

4、  运行结果

3.COM实践C#
3.1.C#创建COM组件

1、  创建C#工程MyCSharpCom。

2、  更改CS文件名称为CMathAdd.cs。

3、  源码如下。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices; namespace MyCSharpCom
{
[Guid("EAF3D6F6-D8D0-4a06-96BF-C63402B8090E")]
public interface IMathAdd
{
/// <summary>
/// 加法运算
/// </summary>
/// <param name="num1">整数1</param>
/// <param name="num2">整数2</param>
/// <returns>返回两数字之和</returns>
int Add(int num1, int num2);
} [Guid("CD9A8CF8-5C46-4b80-8DF6-74D27D7C09BB")]
[ClassInterface(ClassInterfaceType.None)]//不为类生成类接口
public class CMathAdd : IMathAdd
{
/// <summary>
/// 构造函数
/// </summary>
public CMathAdd()
{ } /// <summary>
/// 加法运算
/// </summary>
/// <param name="num1">整数1</param>
/// <param name="num2">整数2</param>
/// <returns>返回两数字之和</returns>
public int Add(int num1, intnum2)
{
return num1 + num2;
}
}
}

其中GUID生成方式,VS中Tools->Create GUID。

4、  修改AssemblyInfo.cs中ComVisible设置true。

5、  设置COM互操作注册(勾选Register for COMinterop)。

6、  生成结果文件。

MyCSharpCom.dll

MyCSharpCom.pdb

MyCSharpCom.tlb

3.2. 使用VC调用

1、  创建VC工程VCUseCSharp。

2、  C#生成的组件“CLCOMTestInCSharp.tlb”拷贝到VC的工程目录。

3、  源码如下。

#include <iostream>
#import "MyCSharpCom.tlb" using namespace MyCSharpCom;
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
long num1,num2,num3;//定义变量
num1=1,num2=2,num3=0;
CoInitialize(NULL);
IMathAddPtr p_Add(__uuidof(CMathAdd));
num3 = p_Add->Add(num1,num2);
p_Add.Release();
p_Add = NULL;
CoUninitialize(); cout<<"1+2="<<num3<<endl; return0;
}

4、  运行结果如下。

3.3. 使用C#调用

1、  创建工程。

2、  将“MyCSharpCom.dll”复制到程序目录。

3、  添加引用。

4、  响应代码。

       private void button1_Click(object sender, EventArgs e)
{
MyCSharpCom.CMathAdd add = new MyCSharpCom.CMathAdd();//定义Add类的对象
int num1, num2, num3;//定义变量
num1 = 1; num2 = 2; num3 = 0;//变量初始化
num3 = add.Add(num1, num2);//调用COM
MessageBox.Show("1+2=" + num3.ToString());//使用消息显示结果
}

5、  运行结果。

COM编程VS实践的更多相关文章

  1. Java 网络编程最佳实践(转载)

    http://yihongwei.com/2015/09/remoting-practice/ Java 网络编程最佳实践 Sep 10, 2015 | [Java, Network] 1. 通信层 ...

  2. JS编程最佳实践

    最近花了一周时间把<编写可维护的js> 阅读了一遍, 现将全书提到的JS编程最佳实践总结如下, 已追来者! 1.return 之后不可直接换行, 否则会导致ASI(自动分号插入机制)会在r ...

  3. 实验5 Spark SQL编程初级实践

    今天做实验[Spark SQL 编程初级实践],虽然网上有答案,但都是用scala语言写的,于是我用java语言重写实现一下. 1 .Spark SQL 基本操作将下列 JSON 格式数据复制到 Li ...

  4. 实验 5 Spark SQL 编程初级实践

    实验 5  Spark SQL 编程初级实践    参考厦门大学林子雨 1. Spark SQL 基本操作 将下列 json 数据复制到你的 ubuntu 系统/usr/local/spark 下,并 ...

  5. [04] C# Alloc Free编程之实践

    C# Alloc Free编程之实践 上一篇说了Alloc Free编程的基本理论. 这篇文章就说怎么具体做实践. 常识 之所以说是常识, 那是因为我们在学任何一门语言的时候, 都能在各种书上看到各种 ...

  6. 实验 2 Scala 编程初级实践

    实验 2 Scala 编程初级实践 一.实验目的 1.掌握 Scala 语言的基本语法.数据结构和控制结构: 2.掌握面向对象编程的基础知识,能够编写自定义类和特质: 3.掌握函数式编程的基础知识,能 ...

  7. 由表单验证说起,关于在C#中尝试链式编程的实践

    在web开发中必不可少的会遇到表单验证的问题,为避免数据在写入到数据库时出现异常,一般比较安全的做法是前端会先做一次验证,通过后把数据提交到后端再验证一次,因为仅仅靠前端验证是不安全的,有太多的htt ...

  8. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

  9. Java编程规范实践

    一个好的编程规范可以让代码易于理解,具体的操作却不必如此麻烦. 本文包含以下内容: Eclipse Java代码Formatter配置 Eclipse 代码模板配置 自动添加Javadoc注释 附录: ...

随机推荐

  1. extends:类似于java中的继承特征,extends="struts-default"

    extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...

  2. poj1989

    一道非常神奇的题目 var v:array[0..10010] of boolean; n,k,i,x,ans,s:longint; begin readln(n,k); fillchar(v,siz ...

  3. LeetCode Excel Sheet Column Title (输出excel表的列名称)

    题意:给一个数字n,输出excel表的列名称. 思路:其实观察可知道,是个26进制的标记而已.那就模拟一下,每次计算一位时就先左移1位,再进行计算. class Solution { public: ...

  4. 银行卡luhm校验算法

    /** * 15位银行卡luhm校验算法 * 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. * 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...

  5. (2)java堆内存

    java堆内存结构图 [名词解释]--->eden,so,s1通称为新生代对象储区--->tenured称为老年代对象存储区--->s0和s1也称为from和to区域,是两块大小相等 ...

  6. 【转】10分钟搭建NDK的Android开发环境

    原文网址:http://blog.csdn.net/u012176591/article/details/23018913 作者:金良(golden1314521@gmail.com) csdn博客: ...

  7. GitHub进一步了解

    为什么要引入Git: 1)用简单一点的例子来讲: 一个公司有几个甚至十几个人共同合作开发一款项目的时候,公司对项目代码有明确规范,不可能再像学校做的小项目一样,你觉得哪个同学的代码写的不好,或者和你的 ...

  8. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

    下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...

  9. SQL中的CASE WHEN用法

    其语法如下: 1)case vlaue when [compare-value]then reslut [when[compare-value]] then result ...] [else res ...

  10. POJ 2378-Tree Cutting(树形dp)

    题意: n个节点的树,删除一个点,得到的最大联通分支大小不大于总节点数的一半,求这样点的集合 分析:和上题一样 #include <map> #include <set> #i ...