C++和C#相互调用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组件程序,一个为C++和C#相互调用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 here
- int 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 here
- CString 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();
- }
C++和C#相互调用COM组件的方法简介相关推荐
- 来总结一下在VC中调用COM组件的方法
来总结一下在VC中调用COM组件的方法(大家来补充) [问题点数:50分,结帖人_foo] http://bbs.csdn.net/topics/50319093 发表于: 2004-04-17 16 ...
- Vue中父组件调用子组件的方法
场景 SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图: SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图_BADAO_LIUMANG_ ...
- Angular中父组件通过ViewChild调用子组件的方法
场景 Angualr中通过原生js和ViewChild的方式获取dom: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10586 ...
- vue 父组件 调用 子组件的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法 例: ...
- iframe调用父页面方法_5.1 vue中子组件调用父组件的方法,务必理解自定义事件的重要性...
问题:vue中子组件调用父组件的方法 通过v-on 监听 和$emit触发来实现: 1.在父组件中 通过v-on 监听 当前实例上的 自定义事件. 2.在子组件 中 通过'$emit'触发 当前实例上 ...
- vue中组件之间调用方法——子组件调用父组件的方法 父组件调用子组件的方法
vue中组件之间调用方法--子组件调用父组件的方法 & 父组件调用子组件的方法 1.vue中子组件调用父组件的方法 1.1.第一种方法是直接在子组件中通过this.$parent.event来 ...
- vue父组件中调用子组件中的方法 及vue父组件调用孙子组件的方法
一:通过ref直接调用子组件的方法: 子组件child.vue: <template><div>我是子组件</div> </template> < ...
- 子组件调用父组件中方法的方法
1.在子组件中用this.$parent.fn()来调用父组件的方法 父组件中: <script>export default {methods: {parentFn() {console ...
- vue3 setup语法糖下父组件调用子组件的方法
vue3下,父组件调用子组件的方法,如果使用了<script setup> 这种写法,那么子组件方法需要采用defineExpose()进行修饰,才能被外界调用.上代码: 1.子组件 _p ...
最新文章
- RDKit | 基于相似图可视化原子贡献
- 12 个最佳的免费网络监控工具--转载
- 什么是野指针和内存泄露?如何避免野指针
- Struts2入门(二)——配置拦截器
- 如何回答性能优化的问题,才能打动阿里面试官?
- 未检测到其他显示器_同维工控机显示器显示器没反应维修技术精湛
- Oracle系列:Oracle RAC集群体系结构
- C语言和C++中Struct区别
- CodeSmith实用技巧(五):利用继承生成可变化的代码
- 我能想到的圆角背景的实现方法
- Nginx服务的ssl认证和htpasswd认证
- oracle监听防止连接风暴,Oracle Listener 监听风暴处理
- 手机照片局部放大镜_拼音输入法哪个最好?百度手机输入法——最受年轻人喜爱...
- 24个基本指标精粹讲解(2)--KDJ
- 初识Uniprot API
- 混jdon坛子的一些思考
- 互联网必备技能1-写好PPT
- layui 动态表格 合并单元格
- for/in 循环遍历对象的属性
- 树莓派 raspbian 系统常用命令
热门文章
- redis将散裂中某个值自增_redis五种数据类型
- psychopy 音频时长代码_PsychoPy入门_03_视频和音频的呈现
- batchnorm pytorch_GitHub趋势榜第一:TensorFlow+PyTorch深度学习资源大汇总
- php socket传递cookie,PHP Websocket在测试中验证用户(传递会话cookie)
- mysql relay log时间_如何得到Slave应用relay-log的时间
- 计算机二级vf上机试题,2016年计算机二级《VF》上机题及答案
- php pdo无法使用,php - php-无法使用PDO连接到数据库 - SO中文参考 - www.soinside.com
- linux中使用u盘和光驱的命令_Linux文件操作高频使用命令
- VHDL设计出租车计价器
- asp python 定时任务_python定时任务最强框架APScheduler详细教程