前一阵在工作中做项目的时候,遇到了COM组件的调用和使用问题,当时研究和好一阵,才把中间的环节打通,现在写出来为大家提供方便,这里包含了四个类型:

1、在VS2005中,C#编写DLL并使用C++调用

2、在VS2005中C#编写的COM组件,使用VC6.0调用

3、在VC6.0中编写COM组件,使用VS2005 C#调用

4、在VC6.0中编写COM组件,使用VC6.0调用

其中每个类型都写了两个程序,一个为COM组件程序,一个为调用程序

程序实现:

1、在VS2005中,C#编写DLL并使用C++调用

(1)C#编写DLL程序

建立C#编写的DLL程序AddDll,项目类型为:类库

程序代码:

using System;
using System.Collections.Generic;
using System.Text;namespace AddDll
{public class Add{public int iadd(int a, int b){int c = a + b;return c;}}
}

(2)C++编写调用程序

建立C++的Win32控制台应用程序UseDll,项目类型为:Win32控制台应用程序

配置:右键点击解决方案资源管理器中的UseDll,选择“属性”,将公共语言运行库支持设置为“公共语言运行库支持(/clr)”

程序代码:

#include "stdafx.h"
#include "stdio.h"#using "../debug/AddDll.dll"
using namespace AddDll;int _tmain(int argc, _TCHAR* argv[])
{int result;Add ^add = gcnew Add();result = add->iadd(10,90);printf("%d",result);scanf("%s");return 0;
}

2、在VS2005中C#编写的COM组件,使用VC6.0调用

(1)VS2005中使用C#编写COM组件

建立C#编写的COM组件,项目类型为类库

配置:右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“生成”,选择“为COM Interop注册(_P)”

打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)]

这用就可以生成AddCom.tlb文件

程序代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;namespace AddCom
{//可以通过//菜单的 “工具/guid生成”。//注意要选择Define Guid{….}格式,并全//部保存下来,保存到哪都行,记事本呀什么的。//因为在做VC程序/的时候要用到的。[Guid("298D881C-E2A3-4638-B872-73EADE25511C")]  public interface AddComInterface{[DispId(1)]int iadd(int a, int b);[DispId(2)]float ladd(float a, float b);}[Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")][ClassInterface(ClassInterfaceType.None)]public class AddComService : AddComInterface{public AddComService(){}public int iadd(int a, int b){int c = 0;c = a + b;return c;}public float ladd(float a, float b){float c = 0;c = a + b;return c;}}
}

(2)VC6.0编写调用程序

使用VC6.0编写建立MFC应用程序UseCom,项目类型为MFC AppWizard(exe)

在stdafx.h添加:

#import "AddCom.tlb"
using namespace AddCom;程序代码:
void CUseComDlg::OnButtonUse()
{// TODO: Add your control notification handler code hereint dresult;float fresult;CString strResult;CoInitialize(NULL);//NULL换成0也可以AddCom::AddComInterfacePtr p_Add(__uuidof(AddComService));dresult = p_Add->iadd(1,2);fresult = p_Add->fadd(1.2,2.3);strResult.Format("int:%d /nfloat:%f",dresult,fresult);MessageBox(strResult,"计算结果",MB_OK);CoUninitialize();   }3、在VC6.0中编写COM组件,使用VS2005 C#调用

(1)VC6.0编写COM

使用VC6.0建立COM组件,工程类型:ATL COM AppWizard

程序代码:

接口:
interface IAdd : IDispatch{[id(1), helpstring("method iadd")] HRESULT iadd([in]int a, [in]int b, [out]int * c);[id(2), helpstring("method fadd")] HRESULT fadd([in]float a, [in]float b, [out]float * c);[id(3), helpstring("method isub")] HRESULT isub([in]int a, [in]int b, [out]int * c);};实现:
STDMETHODIMP CAdd::iadd(int a, int b, int *c)
{// TODO: Add your implementation code here*c = a + b;return S_OK;
}STDMETHODIMP CAdd::fadd(float a, float b, float *c)
{// TODO: Add your implementation code here*c = a + b;return S_OK;
}STDMETHODIMP CAdd::isub(int a, int b, int *c)
{// TODO: Add your implementation code here*c = a - b;return S_OK;
}

(2)VS2005使用C#编写调用程序(网站程序)

使用VS2005建立网站UseCom

配置:在解决方案资源管理器中的主目录点击右键,选择添加引用,选择COM,添加刚刚建立的AddCom 1.0 Type Library

在程序中要using编写的COM组件:using ADDCOMLib;

程序代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ADDCOMLib;public partial class _Default : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){}protected void ButtonCom_Click(object sender, EventArgs e){Add add = new Add();int iresult;float fresult;int sresult;add.IAdd(10, 20, out iresult);add.fadd((float)1.2,(float)2.3, out fresult);add.isub(100, 10, out sresult);TextBoxResult.Text = iresult.ToString();TextBoxRe2.Text = fresult.ToString();TextBoxRe3.Text = sresult.ToString();}
}4、在VC6.0中编写COM组件,使用VC6.0调用

(1)VC6.0编写COM组件

使用VC6.0建立COM组件,工程类型:ATL COM AppWizard

程序代码:

接口:
interface IAdd : IDispatch{[id(1), helpstring("method iadd")] HRESULT iadd([in]int a, [in]int b, [out]int * c);[id(2), helpstring("method fadd")] HRESULT fadd([in]float a, [in]float b, [out]float * c);[id(3), helpstring("method isub")] HRESULT isub([in]int a, [in]int b, [out]int * c);};实现:STDMETHODIMP CAdd::iadd(int a, int b, int *c)
{// TODO: Add your implementation code here*c = a + b;return S_OK;
}STDMETHODIMP CAdd::fadd(float a, float b, float *c)
{// TODO: Add your implementation code here*c = a + b;return S_OK;
}STDMETHODIMP CAdd::isub(int a, int b, int *c)
{// TODO: Add your implementation code here*c = a - b;return S_OK;
}

(2)VC6.0编写调用程序

使用VC6.0建立MFC应用程序UseCOM,调用刚刚建立的COM组件

将上面程序AddCom生成的AddCom.dll放入本程序的工程目录和程序生成目录中

在StdAfx.h中加入:

#import "AddCom.dll" no_namespace

程序代码:

void CUseComDlg::OnBUTTONUse()
{// TODO: Add your control notification handler code hereCString strResult;CoInitialize(NULL);//NULL换成0也可以IAddPtr m_add = NULL;HRESULT hr = S_OK;hr = m_add.CreateInstance(__uuidof(Add));int d_a = 90;int d_b = 10;int d_c;int d_d;float f_a = 1;float f_b = 2;float f_c;m_add->_IAdd(d_a,d_b,&d_c);m_add->fadd(f_a,f_b,&f_c);m_add->isub(d_a,d_b,&d_d);strResult.Format("返回结果:%d; %f; %d",d_c,f_c,d_d);MessageBox(strResult,"结果",MB_OK);m_add.Release();m_add = NULL;CoUninitialize();   }

结束语:希望能对大家有帮助!

转载于:https://www.cnblogs.com/52yixin/articles/2117888.html

[转]C++和C#编写并且相互调用COM组件相关推荐

  1. C++和C#相互调用COM组件的方法简介

     1.在VS2005中,C#编写DLL并使用C++调用 2.在VS2005中C#编写的COM组件,使用VC6.0调用 3.在VC6.0中编写COM组件,使用VS2005 C#调用 4.在VC6.0 ...

  2. python和c学习-学习 Python与C相互调用

    缘由 稀里糊涂的,用 Python 或用 C++ Qt都能写点小程序出来.然后对Python + Qt开始有点兴趣:想学PyQt4,想了解PythonQt,也期待PySide的Windows版本.但总 ...

  3. JAVA与.NET的相互调用——通过Web服务实现相互调用

    JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候 ...

  4. 文档类CDocument、子框架类CFrameWnd及视图类CView的关系及如何相互调用

    文档类.子框架类及视图类的关系及如何相互调用 收藏 了解文档和视图的相互作用关系是编写MFC程序的基本功.但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往 ...

  5. .Net 与 Java 的服务接口相互调用

    本文介绍.Net 与 Java 相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 首先说 ...

  6. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

  7. linux c程序调用脚本,C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  8. 随想录(ccpp之间的相互调用)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 作为系统工程师,平时用c可能多一些.这两天因为工作的原因,了解了linux上面cpp的编写方法. ...

  9. pycharm中两个.py文件相互调用和传递参数

    在编写比较大的程序或团队协同工作时,常常会用到两个.py程序之间的相互调用和传递参数,我把自己理解的一个方法写一下. 首先要求pycharm已经安装了sys库,已知sys.argv是传递参数的核心. ...

最新文章

  1. date string 转化为weekday
  2. Log4Net五步走
  3. Hibernate(九)HQL查询
  4. draw.io二次开发(1)三种运行模式的区别
  5. linux怎么不自动登录,linuxdeepin 如何取消自动登录啊?
  6. JEECG支付服务窗专题 - 支付窗激活开发者模式
  7. STM32(三)-------流水灯(标准库函数)
  8. Intellij IDEA 14 安装之后
  9. TurboMail优势特点
  10. 使用火狐浏览器的原因是什么?使用英文版火狐的原因又是什么?
  11. python安装pika模块rabbitmq
  12. xp系统qq安装不上网络连接服务器,xp系统安装QQ提示“安装文件失败”如何解决...
  13. 2.sklearn—评价指标大全(平均误差、均方误差、混淆矩阵、准确率、查全率、查准率、召回率、特异度,F1-score、G-mean、KS值、ROC曲线、AUC值、损失函数、结构风险最小)
  14. 移动端登录页样式错乱_手机登录界面样式设计启示
  15. AETA地震预测 AI 算法大赛——Helloworld队比赛方案(亚军)
  16. JZYZOJ1384 种花小游戏 状压dp
  17. c语言写街机,19年了!街机模拟器MAME正式成为开源软件
  18. 倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题
  19. java 压缩图片时候加水印
  20. wps 甘特图_「WPS办公助手」3分钟画出高逼格流程图,工作学习规划一目了然,老板都要为你点赞...

热门文章

  1. 无乱码的中文Joomla 1.0.15
  2. 王者荣耀s22服务器未响应是什么意思,王者荣耀s22资源包升级失败 s22解析包出现问题解决方法...
  3. python 六边形架构_通过纯css3代码实现六边形边框
  4. 奖励名单表格模板_员工出勤工薪记算表(行政人事模板)
  5. linux 找回gpt分区,linux – 修复graid mini磁盘上损坏的GPT分区
  6. mysql的索引的区别_MYSQL索引区别
  7. pywebio 和 pyecharts天生一对
  8. leetcode算法第9题
  9. pyaiml聊天机器人
  10. 梁胜博士亲解Rancher 2.0:K8s之上的Rancher魔法