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