1、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#编 写
2、DLL 程 序建 立 C#编 写 的 DLL 程 序 AddDll, 项 目 类 型 为 : 类 库程 序 代 码 :using System;using System.Collections.Generic;using System.Text;namespace AddDllpublic class Addpublic int iadd(int a, int b)int c = a + b;return c;( 2) C+编 写 调 用 程 序建 立 C+的 Win32 控 制 台 应 用 程 序 UseDll, 项 目 类 型 为 : Win32 控 制 台 应 用 程序配 置 : 右 键
3、 点 击 解 决 方 案 资 源 管 理 器 中 的 UseDll, 选 择 “属 性 ”, 将 公 共 语 言 运 行库 支 持 设 置 为 “公 共 语 言 运 行 库 支 持 (/clr)”图 一 公 共 语 言 运 行 库 设 置程 序 代 码 :#include “stdafx.h“#include “stdio.h“#using “debugAddDll.dll“using namespace AddDll;int _tmain(int argc, _TCHAR* argv)int result;Add add = gcnew Add();result = add-iadd(10,
4、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: ComVisibl
5、e(true)这 用 就 可 以 生 成 AddCom.tlb 文 件图 二 COM 生 成 设 置程 序 代 码 :using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace AddCom/可 以 通 过 /菜 单 的 “工 具 /guid 生 成 ”。/注 意 要 选 择 Define Guid.格 式 , 并 全 /部 保 存 下 来 , 保 存到 哪 都 行 , 记 事 本 呀 什 么 的 。/因 为 在 做 VC 程 序 /
6、的 时 候 要 用 到 的 。Guid(“298D881C-E2A3-4638-B872-73EADE25511C“) public interface AddComInterfaceDispId(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 : AddComInterfacepublic AddC
7、omService()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 CUse
8、ComDlg: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:%
9、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 : IDispatchid(1), helpstring(“method iadd“) HRESULT iadd(inint a, inint b, outint
10、* c);id(2), helpstring(“method fadd“) HRESULT fadd(infloat a, infloat b, outfloat * c);id(3), helpstring(“method isub“) HRESULT isub(inint a, inint b, outint * 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(f
11、loat 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配 置 : 在 解 决 方 案 资 源 管 理 器 中 的 主 目 录
12、点 击 右 键 , 选 择 添 加 引 用 , 选 择COM, 添 加 刚 刚 建 立 的 AddCom 1.0 Type Library在 程 序 中 要 using 编 写 的 COM 组 件 : using ADDCOMLib;图 三 引 用 COM程 序 代 码 :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 Syst
13、em.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;a
14、dd.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 组
15、件 , 工 程 类 型 : ATL COM AppWizard程 序 代 码 :接 口 :interface IAdd : IDispatchid(1), helpstring(“method iadd“) HRESULT iadd(inint a, inint b, outint * c);id(2), helpstring(“method fadd“) HRESULT fadd(infloat a, infloat b, outfloat * c);id(3), helpstring(“method isub“) HRESULT isub(inint a, inint b, outint
16、* 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 impleme
17、ntation 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
18、 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,m_add-fadd(f_a,f_b,m_add-isub(d_a,d_b,strResult.Format(“返 回 结 果 : %d; %f; %d“,d_c,f_c,d_d);MessageBox(strResult,“结 果 “,MB_OK);m_add.Release();m_add = NULL;CoUninitialize();