COM编程VS实践

 

目录

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、  运行结果。


 


posted @ 2013-08-09 23:33  pangbangb  阅读(352)  评论(0编辑  收藏  举报