C++和C#编写调用COM组件.docx
- 文档编号:6860101
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:11
- 大小:147.57KB
C++和C#编写调用COM组件.docx
《C++和C#编写调用COM组件.docx》由会员分享,可在线阅读,更多相关《C++和C#编写调用COM组件.docx(11页珍藏版)》请在冰豆网上搜索。
C++和C#编写调用COM组件
C++和C#编写调用COM组件
作者:
徐凌超
下载源代码
摘要:
现在COM组件的使用越来越广泛,在各个程序中调用COM组件我想大家都遇到过,这篇文章就是关于COM组件的编写和调用的,主要包含了使用VC6.0编写和调用COM组件,VS2005中使用C#编写和调用COM组件,以及在VC6.0和VS2005之间互相调用COM组件。
关键字:
VC6.0编写调用COMVS2005中C#编写和调用COMVC6.0和VS2005之间互相调用COM
正文:
前一阵在工作中做项目的时候,遇到了COM组件的调用和使用问题,当时研究和好一阵,才把中间的环节打通,现在写出来为大家提供方便,这里包含了四个类型:
1、在VS2005中,C#编写DLL并使用C++调用
2、在VS2005中C#编写的COM组件,使用VC6.0调用
3、在VC6.0中编写COM组件,使用VS2005C#调用
4、在VC6.0中编写COM组件,使用VC6.0调用
其中每个类型都写了两个程序,一个为COM组件程序,一个为调用程序
程序实现:
1、在VS2005中,C#编写DLL并使用C++调用
(1)C#编写DLL程序
建立C#编写的DLL程序AddDll,项目类型为:
类库
程序代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceAddDll
{
publicclassAdd
{
publicintiadd(inta,intb)
{
intc=a+b;
returnc;
}
}
}
(2)C++编写调用程序
建立C++的Win32控制台应用程序UseDll,项目类型为:
Win32控制台应用程序
配置:
右键点击解决方案资源管理器中的UseDll,选择“属性”,将公共语言运行库支持设置为“公共语言运行库支持(/clr)”
图一公共语言运行库设置
程序代码:
#include"stdafx.h"
#include"stdio.h"
#using"..\debug\AddDll.dll"
usingnamespaceAddDll;
int_tmain(intargc,_TCHAR*argv[])
{
intresult;
Add^add=gcnewAdd();
result=add->iadd(10,90);
printf("%d",result);
scanf("%s");
return0;
}
2、在VS2005中C#编写的COM组件,使用VC6.0调用
(1)VS2005中使用C#编写COM组件
建立C#编写的COM组件,项目类型为类库
配置:
右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“生成”,选择“为COMInterop注册(_P)”
打开AssemblyInfo.cs文件,设置[assembly:
ComVisible(true)]
这用就可以生成AddCom.tlb文件
图二COM生成设置
程序代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
namespaceAddCom
{
//可以通过//菜单的“工具/guid生成”。
//注意要选择DefineGuid{….}格式,并全//部保存下来,保存到哪都行,记事本呀什么的。
//因为在做VC程序/////////的时候要用到的。
[Guid("298D881C-E2A3-4638-B872-73EADE25511C")]
publicinterfaceAddComInterface
{
[DispId
(1)]
intiadd(inta,intb);
[DispId
(2)]
floatladd(floata,floatb);
}
[Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]
[ClassInterface(ClassInterfaceType.None)]
publicclassAddComService:
AddComInterface
{
publicAddComService()
{
}
publicintiadd(inta,intb)
{
intc=0;
c=a+b;
returnc;
}
publicfloatladd(floata,floatb)
{
floatc=0;
c=a+b;
returnc;
}
}
}
(2)VC6.0编写调用程序
使用VC6.0编写建立MFC应用程序UseCom,项目类型为MFCAppWizard(exe)
在stdafx.h添加:
#import"AddCom.tlb"
usingnamespaceAddCom;
程序代码:
voidCUseComDlg:
:
OnButtonUse()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intdresult;
floatfresult;
CStringstrResult;
CoInitialize(NULL);//NULL换成0也可以
AddCom:
:
AddComInterfacePtrp_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组件,使用VS2005C#调用
(1)VC6.0编写COM
使用VC6.0建立COM组件,工程类型:
ATLCOMAppWizard
程序代码:
接口:
interfaceIAdd:
IDispatch
{
[id
(1),helpstring("methodiadd")]HRESULTiadd([in]inta,[in]intb,[out]int*c);
[id
(2),helpstring("methodfadd")]HRESULTfadd([in]floata,[in]floatb,[out]float*c);
[id(3),helpstring("methodisub")]HRESULTisub([in]inta,[in]intb,[out]int*c);
};
实现:
STDMETHODIMPCAdd:
:
iadd(inta,intb,int*c)
{
//TODO:
Addyourimplementationcodehere
*c=a+b;
returnS_OK;
}
STDMETHODIMPCAdd:
:
fadd(floata,floatb,float*c)
{
//TODO:
Addyourimplementationcodehere
*c=a+b;
returnS_OK;
}
STDMETHODIMPCAdd:
:
isub(inta,intb,int*c)
{
//TODO:
Addyourimplementationcodehere
*c=a-b;
returnS_OK;
}
(2)VS2005使用C#编写调用程序(网站程序)
使用VS2005建立网站UseCom
配置:
在解决方案资源管理器中的主目录点击右键,选择添加引用,选择COM,添加刚刚建立的AddCom1.0TypeLibrary
在程序中要using编写的COM组件:
usingADDCOMLib;
图三引用COM
程序代码:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingADDCOMLib;
publicpartialclass_Default:
System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
}
protectedvoidButtonCom_Click(objectsender,EventArgse)
{
Addadd=newAdd();
intiresult;
floatfresult;
intsresult;
add.IAdd(10,20,outiresult);
add.fadd((float)1.2,(float)2.3,outfresult);
add.isub(100,10,outsresult);
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组件,工程类型:
ATLCOMAppWizard
程序代码:
接口:
interfaceIAdd:
IDispatch
{
[id
(1),helpstring("methodiadd")]HRESULTiadd([in]inta,[in]intb,[out]int*c);
[id
(2),helpstring("methodfadd")]HRESULTfadd([in]floata,[in]floatb,[out]float*c);
[id(3),helpstring("methodisub")]HRESULTisub([in]inta,[in]intb,[out]int*c);
};
实现:
STDMETHODIMPCAdd:
:
iadd(inta,intb,int*c)
{
//TODO:
Addyourimplementationcodehere
*c=a+b;
returnS_OK;
}
STDMETHODIMPCAdd:
:
fadd(floata,floatb,float*c)
{
//TODO:
Addyourimplementationcodehere
*c=a+b;
returnS_OK;
}
STDMETHODIMPCAdd:
:
isub(inta,intb,int*c)
{
//TODO:
Addyourimplementationcodehere
*c=a-b;
returnS_OK;
}
(2)VC6.0编写调用程序
使用VC6.0建立MFC应用程序UseCOM,调用刚刚建立的COM组件
将上面程序AddCom生成的AddCom.dll放入本程序的工程目录和程序生成目录中
在StdAfx.h中加入:
#import"AddCom.dll"no_namespace
程序代码:
voidCUseComDlg:
:
OnBUTTONUse()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrResult;
CoInitialize(NULL);//NULL换成0也可以
IAddPtrm_add=NULL;
HRESULThr=S_OK;
hr=m_add.CreateInstance(__uuidof(Add));
intd_a=90;
intd_b=10;
intd_c;
intd_d;
floatf_a=1;
floatf_b=2;
floatf_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();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ C# 编写 调用 COM 组件