zoukankan      html  css  js  c++  java
  • 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、  运行结果。



  • 相关阅读:
    SDK Manager.exe和AVD Manager.exe缺失,Android SDK Tools在检查java环境时卡住了,未响应卡死!
    GetLastError结果列表
    VS2008 远程调试器未成功安装,没法使用?
    远程桌面连接无法相互拷贝文件了?
    VS2008编译错误:error C2065: 'PMIB_TCPSTATS' : undeclared identifier c:program files (x86)microsoft sdkswindowsv7.0aincludeiphlpapi.h 411
    C++ 保存Excel文件(带密码保护)
    UTF8与std:string互转
    将windbg设置为默认调试器命令
    VC++ 链接错误LINK : fatal error LNK1104: cannot open file "*.lib"
    IAP升级程序中Bootloader和APP程序中断复用的解决办法
  • 原文地址:https://www.cnblogs.com/pangblog/p/3249295.html
Copyright © 2011-2022 走看看