• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

VC6.0和VS2005:C++和C#编写调用COM组件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  • 这篇文章就是关于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,项目类型为:类库

程序代码:


  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. namespaceAddDll
  5. {
  6. publicclassAdd
  7. {
  8. publicintiadd(inta,intb)
  9. {
  10. intc=a+b;
  11. returnc;
  12. }
  13. }
  14. }

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

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

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

C++编写调用程序:公共语言运行库设置

程序代码:


  1. #include"stdafx.h"
  2. #include"stdio.h"
  3. #using"../debug/AddDll.dll"
  4. usingnamespaceAddDll;
  5. int_tmain(intargc,_TCHAR*argv[])
  6. {
  7. intresult;
  8. Add^add=gcnewAdd();
  9. result=add->iadd(10,90);
  10. printf("%d",result);
  11. scanf("%s");
  12. return0;
  13. }

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生成设置

程序代码:


  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Runtime.InteropServices;
  5. namespaceAddCom
  6. {
  7. //可以通过//菜单的“工具/guid生成”。
  8. //注意要选择DefineGuid{….}格式,并全//部保存下来,保存到哪都行,记事本呀什么的。
  9. //因为在做VC程序/////////的时候要用到的。
  10. [Guid("298D881C-E2A3-4638-B872-73EADE25511C")]
  11. publicinterfaceAddComInterface
  12. {
  13. [DispId(1)]
  14. intiadd(inta,intb);
  15. [DispId(2)]
  16. floatladd(floata,floatb);
  17. }
  18. [Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]
  19. [ClassInterface(ClassInterfaceType.None)]
  20. publicclassAddComService:AddComInterface
  21. {
  22. publicAddComService()
  23. {
  24. }
  25. publicintiadd(inta,intb)
  26. {
  27. intc=0;
  28. c=a+b;
  29. returnc;
  30. }
  31. publicfloatladd(floata,floatb)
  32. {
  33. floatc=0;
  34. c=a+b;
  35. returnc;
  36. }
  37. }
  38. }

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

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

在stdafx.h添加:


  1. #import"AddCom.tlb"
  2. usingnamespaceAddCom;

程序代码:


  1. voidCUseComDlg::OnButtonUse()
  2. {
  3. //TODO:Addyourcontrolnotificationhandlercodehere
  4. intdresult;
  5. floatfresult;
  6. CStringstrResult;
  7. CoInitialize(NULL);//NULL换成0也可以
  8. AddCom::AddComInterfacePtrp_Add(__uuidof(AddComService));
  9. dresult=p_Add->iadd(1,2);
  10. fresult=p_Add->fadd(1.2,2.3);
  11. strResult.Format("int:%d/nfloat:%f",dresult,fresult);
  12. MessageBox(strResult,"计算结果",MB_OK);
  13. CoUninitialize();
  14. }

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

(1)VC6.0编写COM

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

程序代码:

接口:


  1. interfaceIAdd:IDispatch
  2. {
  3. [id(1),helpstring("methodiadd")]HRESULTiadd([in]inta,[in]intb,[out]int*c);
  4. [id(2),helpstring("methodfadd")]HRESULTfadd([in]floata,[in]floatb,[out]float*c);
  5. [id(3),helpstring("methodisub")]HRESULTisub([in]inta,[in]intb,[out]int*c);
  6. };

实现:


  1. STDMETHODIMPCAdd::iadd(inta,intb,int*c)
  2. {
  3. //TODO:Addyourimplementationcodehere
  4. *c=a+b;
  5. returnS_OK;
  6. }
  7. STDMETHODIMPCAdd::fadd(floata,floatb,float*c)
  8. {
  9. //TODO:Addyourimplementationcodehere
  10. *c=a+b;
  11. returnS_OK;
  12. }
  13. STDMETHODIMPCAdd::isub(inta,intb,int*c)
  14. {
  15. //TODO:Addyourimplementationcodehere
  16. *c=a-b;
  17. returnS_OK;
  18. }

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

使用VS2005建立网站UseCom

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

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

VS2005使用C#编写调用程序:引用COM

程序代码:


  1. usingSystem;
  2. usingSystem.Data;
  3. usingSystem.Configuration;
  4. usingSystem.Web;
  5. usingSystem.Web.Security;
  6. usingSystem.Web.UI;
  7. usingSystem.Web.UI.WebControls;
  8. usingSystem.Web.UI.WebControls.WebParts;
  9. usingSystem.Web.UI.HtmlControls;
  10. usingADDCOMLib;
  11. publicpartialclass_Default:System.Web.UI.Page
  12. {
  13. protectedvoidPage_Load(objectsender,EventArgse)
  14. {
  15. }
  16. protectedvoidButtonCom_Click(objectsender,EventArgse)
  17. {
  18. Addadd=newAdd();
  19. intiresult;
  20. floatfresult;
  21. intsresult;
  22. add.IAdd(10,20,outiresult);
  23. add.fadd((float)1.2,(float)2.3,outfresult);
  24. add.isub(100,10,outsresult);
  25. TextBoxResult.Text=iresult.ToString();
  26. TextBoxRe2.Text=fresult.ToString();
  27. TextBoxRe3.Text=sresult.ToString();
  28. }
  29. }

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

(1)VC6.0编写COM组件

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

程序代码:

接口:


  1. interfaceIAdd:IDispatch
  2. {
  3. [id(1),helpstring("methodiadd")]HRESULTiadd([in]inta,[in]intb,[out]int*c);
  4. [id(2),helpstring("methodfadd")]HRESULTfadd([in]floata,[in]floatb,[out]float*c);
  5. [id(3),helpstring("methodisub")]HRESULTisub([in]inta,[in]intb,[out]int*c);
  6. };

实现:


  1. STDMETHODIMPCAdd::iadd(inta,intb,int*c)
  2. {
  3. //TODO:Addyourimplementationcodehere
  4. *c=a+b;
  5. returnS_OK;
  6. }
  7. STDMETHODIMPCAdd::fadd(floata,floatb,float*c)
  8. {
  9. //TODO:Addyourimplementationcodehere
  10. *c=a+b;
  11. returnS_OK;
  12. }
  13. STDMETHODIMPCAdd::isub(inta,intb,int*c)
  14. {
  15. //TODO:Addyourimplementationcodehere
  16. *c=a-b;
  17. returnS_OK;
  18. }

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

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

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

在StdAfx.h中加入:


  1. #import"AddCom.dll"no_namespace

程序代码:


  1. voidCUseComDlg::OnBUTTONUse()
  2. {
  3. //TODO:Addyourcontrolnotificationhandlercodehere
  4. CStringstrResult;
  5. CoInitialize(NULL);//NULL换成0也可以
  6. IAddPtrm_add=NULL;
  7. HRESULThr=S_OK;
  8. hr=m_add.CreateInstance(__uuidof(Add));
  9. intd_a=90;
  10. intd_b=10;
  11. intd_c;
  12. intd_d;
  13. floatf_a=1;
  14. floatf_b=2;
  15. floatf_c;
  16. m_add->_IAdd(d_a,d_b,&d_c);
  17. m_add->fadd(f_a,f_b,&f_c);
  18. m_add->isub(d_a,d_b,&d_d);
  19. strResult.Format("返回结果:%d;%f;%d",d_c,f_c,d_d);
  20. MessageBox(strResult,"结果",MB_OK);
  21. m_add.Release();
  22. m_add=NULL;
  23. CoUninitialize();
  24. }
  • 这篇文章就是关于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,项目类型为:类库

程序代码:


  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. namespaceAddDll
  5. {
  6. publicclassAdd
  7. {
  8. publicintiadd(inta,intb)
  9. {
  10. intc=a+b;
  11. returnc;
  12. }
  13. }
  14. }

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

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

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

C++编写调用程序:公共语言运行库设置

程序代码:


  1. #include"stdafx.h"
  2. #include"stdio.h"
  3. #using"../debug/AddDll.dll"
  4. usingnamespaceAddDll;
  5. int_tmain(intargc,_TCHAR*argv[])
  6. {
  7. intresult;
  8. Add^add=gcnewAdd();
  9. result=add->iadd(10,90);
  10. printf("%d",result);
  11. scanf("%s");
  12. return0;
  13. }

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生成设置

程序代码:


  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Runtime.InteropServices;
  5. namespaceAddCom
  6. {
  7. //可以通过//菜单的“工具/guid生成”。
  8. //注意要选择DefineGuid{….}格式,并全//部保存下来,保存到哪都行,记事本呀什么的。
  9. //因为在做VC程序/////////的时候要用到的。
  10. [Guid("298D881C-E2A3-4638-B872-73EADE25511C")]
  11. publicinterfaceAddComInterface
  12. {
  13. [DispId(1)]
  14. intiadd(inta,intb);
  15. [DispId(2)]
  16. floatladd(floata,floatb);
  17. }
  18. [Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]
  19. [ClassInterface(ClassInterfaceType.None)]
  20. publicclassAddComService:AddComInterface
  21. {
  22. publicAddComService()
  23. {
  24. }
  25. publicintiadd(inta,intb)
  26. {
  27. intc=0;
  28. c=a+b;
  29. returnc;
  30. }
  31. publicfloatladd(floata,floatb)
  32. {
  33. floatc=0;
  34. c=a+b;
  35. returnc;
  36. }
  37. }
  38. }

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

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

在stdafx.h添加:


  1. #import"AddCom.tlb"
  2. usingnamespaceAddCom;

程序代码:


  1. voidCUseComDlg::OnButtonUse()
  2. {
  3. //TODO:Addyourcontrolnotificationhandlercodehere
  4. intdresult;
  5. floatfresult;
  6. CStringstrResult;
  7. CoInitialize(NULL);//NULL换成0也可以
  8. AddCom::AddComInterfacePtrp_Add(__uuidof(AddComService));
  9. dresult=p_Add->iadd(1,2);
  10. fresult=p_Add->fadd(1.2,2.3);
  11. strResult.Format("int:%d/nfloat:%f",dresult,fresult);
  12. MessageBox(strResult,"计算结果",MB_OK);
  13. CoUninitialize();
  14. }

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

(1)VC6.0编写COM

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

程序代码:

接口:


  1. interfaceIAdd:IDispatch
  2. {
  3. [id(1),helpstring("methodiadd")]HRESULTiadd([in]inta,[in]intb,[out]int*c);
  4. [id(2),helpstring("methodfadd")]HRESULTfadd([in]floata,[in]floatb,[out]float*c);
  5. [id(3),helpstring("methodisub")]HRESULTisub([in]inta,[in]intb,[out]int*c);
  6. };

实现:


  1. STDMETHODIMPCAdd::iadd(inta,intb,int*c)
  2. {
  3. //TODO:Addyourimplementationcodehere
  4. *c=a+b;
  5. returnS_OK;
  6. }
  7. STDMETHODIMPCAdd::fadd(floata,floatb,float*c)
  8. {
  9. //TODO:Addyourimplementationcodehere
  10. *c=a+b;
  11. returnS_OK;
  12. }
  13. STDMETHODIMPCAdd::isub(inta,intb,int*c)
  14. {
  15. //TODO:Addyourimplementationcodehere
  16. *c=a-b;
  17. returnS_OK;
  18. }

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

使用VS2005建立网站UseCom

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

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

VS2005使用C#编写调用程序:引用COM

程序代码:


  1. usingSystem;
  2. usingSystem.Data;
  3. usingSystem.Configuration;
  4. usingSystem.Web;
  5. usingSystem.Web.Security;
  6. usingSystem.Web.UI;
  7. usingSystem.Web.UI.WebControls;
  8. usingSystem.Web.UI.WebControls.WebParts;
  9. usingSystem.Web.UI.HtmlControls;
  10. usingADDCOMLib;
  11. publicpartialclass_Default:System.Web.UI.Page
  12. {
  13. protectedvoidPage_Load(objectsender,EventArgse)
  14. {
  15. }
  16. protectedvoidButtonCom_Click(objectsender,EventArgse)
  17. {
  18. Addadd=newAdd();
  19. intiresult;
  20. floatfresult;
  21. intsresult;
  22. add.IAdd(10,20,outiresult);
  23. add.fadd((float)1.2,(float)2.3,outfresult);
  24. add.isub(100,10,outsresult);
  25. TextBoxResult.Text=iresult.ToString();
  26. TextBoxRe2.Text=fresult.ToString();
  27. TextBoxRe3.Text=sresult.ToString();
  28. }
  29. }

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

(1)VC6.0编写COM组件

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

程序代码:

接口:


  1. interfaceIAdd:IDispatch
  2. {
  3. [id(1),helpstring("methodiadd")]HRESULTiadd([in]inta,[in]intb,[out]int*c);
  4. [id(2),helpstring("methodfadd")]HRESULTfadd([in]floata,[in]floatb,[out]float*c);
  5. [id(3),helpstring("methodisub")]HRESULTisub([in]inta,[in]intb,[out]int*c);
  6. };

实现:


  1. STDMETHODIMPCAdd::iadd(inta,intb,int*c)
  2. {
  3. //TODO:Addyourimplementationcodehere
  4. *c=a+b;
  5. returnS_OK;
  6. }
  7. STDMETHODIMPCAdd::fadd(floata,floatb,float*c)
  8. {
  9. //TODO:Addyourimplementationcodehere
  10. *c=a+b;
  11. returnS_OK;
  12. }
  13. STDMETHODIMPCAdd::isub(inta,intb,int*c)
  14. {
  15. //TODO:Addyourimplementationcodehere
  16. *c=a-b;
  17. returnS_OK;
  18. }

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

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

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

在StdAfx.h中加入:


  1. #import"AddCom.dll"no_namespace

程序代码:


  1. voidCUseComDlg::OnBUTTONUse()
  2. {
  3. //TODO:Addyourcontrolnotificationhandlercodehere
  4. CStringstrResult;
  5. CoInitialize(NULL);//NULL换成0也可以
  6. IAddPtrm_add=NULL;
  7. HRESULThr=S_OK;
  8. hr=m_add.CreateInstance(__uuidof(Add));
  9. intd_a=90;
  10. intd_b=10;
  11. intd_c;
  12. intd_d;
  13. floatf_a=1;
  14. floatf_b=2;
  15. floatf_c;
  16. m_add->_IAdd(d_a,d_b,&d_c);
  17. m_add->fadd(f_a,f_b,&f_c);
  18. m_add->isub(d_a,d_b,&d_d);
  19. strResult.Format("返回结果:%d;%f;%d",d_c,f_c,d_d);
  20. MessageBox(strResult,"结果",MB_OK);
  21. m_add.Release();
  22. m_add=NULL;
  23. CoUninitialize();
  24. }

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#控制DTA-115卡发布时间:2022-07-10
下一篇:
[原创]C#由DataTable创建TreeView发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap