-
这篇文章就是关于COM组件的编写和调用的,主要包含了使用VC6.0编写和调用COM组件,VS2005中使用C#编写和调用COM组件,以及在VC6.0和VS2005之间互相调用COM组件。
前一阵在工作中做项目的时候,遇到了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,项目类型为:类库
程序代码:
- usingSystem;
-
usingSystem.Collections.Generic;
-
usingSystem.Text;
-
namespaceAddDll
- {
-
publicclassAdd
- {
-
publicintiadd(inta,intb)
- {
-
intc=a+b;
-
returnc;
- }
- }
- }
(2)C++编写调用程序
建立C++的Win32控制台应用程序UseDll,项目类型为:Win32控制台应用程序
配置:右键点击解决方案资源管理器中的UseDll,选择“属性”,将公共语言运行库支持设置为“公共语言运行库支持(/clr)”
C++编写调用程序:公共语言运行库设置
程序代码:
- #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,选择“属性”,选择“生成”,选择“为COM Interop注册(_P)”
打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)]
这用就可以生成AddCom.tlb文件
VS2005中使用C#编写COM组件: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,项目类型为MFC AppWizard(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组件,使用VS2005 C#调用
(1)VC6.0编写COM
使用VC6.0建立COM组件,工程类型:ATL COM AppWizard
程序代码:
接口:
- 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,添加刚刚建立的AddCom 1.0 Type Library
在程序中要using编写的COM组件:using ADDCOMLib;
VS2005使用C#编写调用程序:引用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组件,工程类型:ATL COM AppWizard
程序代码:
接口:
- 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();
-
- }
-
这篇文章就是关于COM组件的编写和调用的,主要包含了使用VC6.0编写和调用COM组件,VS2005中使用C#编写和调用COM组件,以及在VC6.0和VS2005之间互相调用COM组件。
前一阵在工作中做项目的时候,遇到了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,项目类型为:类库
程序代码:
- usingSystem;
-
usingSystem.Collections.Generic;
-
usingSystem.Text;
-
namespaceAddDll
- {
-
publicclassAdd
- {
-
publicintiadd(inta,intb)
- {
-
intc=a+b;
-
returnc;
- }
- }
- }
(2)C++编写调用程序
建立C++的Win32控制台应用程序UseDll,项目类型为:Win32控制台应用程序
配置:右键点击解决方案资源管理器中的UseDll,选择“属性”,将公共语言运行库支持设置为“公共语言运行库支持(/clr)”
C++编写调用程序:公共语言运行库设置
程序代码:
- #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,选择“属性”,选择“生成”,选择“为COM Interop注册(_P)”
打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)]
这用就可以生成AddCom.tlb文件
VS2005中使用C#编写COM组件: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,项目类型为MFC AppWizard(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组件,使用VS2005 C#调用
(1)VC6.0编写COM
使用VC6.0建立COM组件,工程类型:ATL COM AppWizard
程序代码:
接口:
- 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,添加刚刚建立的AddCom 1.0 Type Library
在程序中要using编写的COM组件:using ADDCOMLib;
VS2005使用C#编写调用程序:引用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组件,工程类型:ATL COM AppWizard
程序代码:
接口:
- 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();
-
- }
|
请发表评论