COM组件编写与调用

合集下载

C#调用COM组件的几个步骤

C#调用COM组件的几个步骤

C#调⽤COM组件的⼏个步骤< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>这⾥我们将介绍C#调⽤COM组件的⼏个步骤,先将Com类型信息转换为.NET元数据,然后查看元数据,最后测试程序。

⾸先将Com类型信息转换为.NET元数据1. tlbimp sample.dll /out: sample_clw.dll⼯具:Tlbimp.exe(类型库导⼊程序)参考:.Net framework SDK ⽂档1. ms-help://FrameworkSDK.CHS/cptools/html/cpgrftypelibraryimportertlbimpexe.htm查看元数据⼯具:ILDasm参考:ms-help://FrameworkSDK.CHS/cptutorials/html/il_dasm_tutorial.htm测试程序:⽣成⼀个console programme在project->add reference⾥,选择com,browser你的com,selectok,现在在你的bin⽬录下应该有⼀个sample_clw.dll了下⾯我们来⽤sample_clw的⽅法1. using System;2. using sample_clw;3. namespace CompConsole4. {5. /// <summary>6. /// Class1 的摘要说明。

7. /// </summary>8. class Class19. {10. /// <summary>11. /// 应⽤程序的主⼊⼝点。

12. /// Date:2003/6/2013. /// </summary>14. [STAThread]15. static void Main(string[] args)16. {17. //18. // TODO: 在此处添加代码以启动应⽤程序19. Console.Write ("=======Demo for Call com functions in c#=============\n");20. sampleClass sam = new sampleClass();21. //now we call functions22. //23. sam.SayHello();24. }25. }。

com编程

com编程

基本元素定义
我们从下往上看。接口只不过是一组函数。这些函数被称为方法。接口名字以大写的I开头,例如C++中的 IShellLink,接口被设计成一个抽象基类,其中只有纯粹的虚拟函数。
接口可以从其它接口继承,这里所说的继承的原理就好像C++中的单继承。接口是不允许多继承的。
coclass(简称组件对象类——component object class)被包含在DLL或EXE中,并且包含着一个或者多 个接口的代码。组件对象类(coclasss)实现这些接口。COM对象在内存中表现为组件对象类(coclasss)的一 个实例。注意COM“类”和C++“类”是不相同的,尽管常常COM类实现的就是一个C++类。
程度 = E意思是错误(error);
描述 = READREGDB是对错误的描述(意思是不能读注册表数据库)。
谢谢观看
如果你在winerror.h头文件中查找错误代码,会看到许多按照[功能]_[程度]_[描述]命名规范列出的 HRESULT值,由组件返回的通用的HRESULT(类似E_OUTOFMEMORY)在名字中没有功能码。
如:REGDB_E_READREGDB:
功能码 = REGDB,指“注册表数据库(registry database)”;
Hale Waihona Puke 处理HRESULT处理HRESULT
这一部分准备用SUCCEEDED和 FAILED宏进行一些简单的出错处理。主要是深入研究从COM方法返回的 HRESULT,以便达到完全理解和熟练应用。
HRESULT是个32位符号整数,其非负值表示成功,负值表示失败。HRESULT有三个域:程度位(表示成功或 失败),功能码和状态码。功能码表示HRESULT来自什么组件或程序。微软给不同的组件多赋予功能码,如:COM、 任务调度程序等都有功能码。功能码是个16位的值,仅此而已,没有其它内在含义;它在数字和意义之间是随意 关联的;类似GetLastError()返回的值。

COM培训教程

COM培训教程

COM培训教程COM(Component Object Model)是一种用于组件间通信的架构,它可以实现不同应用程序组件的互操作。

COM培训教程旨在向初学者介绍COM的基本概念和使用方法,以帮助他们快速入门并开始开发自己的COM组件。

第一部分:COM概述(约200字)COM是一种面向对象的技术,它允许开发人员将代码模块化并以可重用的方式进行组合。

COM组件可以是任意编程语言编写的,只要它们符合COM的规范,就可以在不同的应用程序中进行调用和使用。

COM的核心概念是接口(Interface)。

接口定义了COM组件提供给其他组件调用的方法和属性。

通过接口,组件之间可以进行交互和通信。

COM组件还具有生命周期管理和对象实例化等基本特性。

第二部分:COM开发环境搭建(约300字)在开始COM开发之前,我们需要安装COM开发所需的工具和环境。

通常,COM开发需要使用Microsoft Visual Studio作为开发集成环境(IDE)。

Visual Studio提供了编译、调试和托管COM组件的功能。

除了IDE,我们还需要安装COM SDK(Software Development Kit),它包含了一些用于COM开发的工具和库。

COM SDK提供了COM组件的编译器、链接器和注册器等工具。

第三部分:COM组件编写(约400字)在这一部分,我们将学习如何编写一个简单的COM组件。

首先,我们需要定义COM组件的接口,接口定义了组件对外提供的方法和属性。

然后,我们需要实现接口,编写组件的具体功能代码。

接着,我们需要注册COM组件,使其可以在其他应用程序中被调用。

注册COM组件需要使用COM注册表,它是一个记录已注册组件信息的数据库。

我们可以使用COM SDK提供的注册器工具来执行注册操作。

最后,我们需要编译和部署COM组件。

编译COM组件需要使用COM编译器,它会将源代码转化为二进制文件。

部署COM组件需要将编译后的二进制文件复制到目标应用程序的目录,并在应用程序中进行配置。

C++调用com控件方法

C++调用com控件方法

C++调⽤com控件⽅法最近要求做⼀个C++调⽤com组件的DEMO。

由于⾃⼰对C++并⽆研究包括IDE⼯具。

后来在⽹上查阅了些资料,经过努⼒终于告⼀段落。

⽹上对于C++加载com组件的⽅法已经说的很多了,我就仅贴下我所使⽤的⽅法(不⽤注册dll,当然⽹上推荐了⼀些更简单也更有实际意义的使⽤⽅式):CLSID clsid;HRESULT hr1=CLSIDFromProgID(OLESTR("PTA.iTrusPTA"),&clsid);//获得dll控件的clsidtypedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);pfnGCO fnGCO = NULL;HINSTANCE hdllInst = LoadLibrary(L"PTAExt.dll"); //加载dllfnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject"); //从dll中得到DllGetClassObjectif (fnGCO != 0){IClassFactory* pcf = NULL;HRESULT hr=(fnGCO)(clsid, IID_IClassFactory, (void**)&pcf); //创建⼯⼚if (SUCCEEDED(hr) && (pcf != NULL)){IiTrusPTA* pFoo = NULL;hr = pcf->CreateInstance(NULL, __uuidof(IiTrusPTA), (void**)&pFoo); //通过⼯⼚创建dll中IiTrusPTA接⼝//调⽤IiTrusPTA具体的业务操作if (SUCCEEDED(hr) && (pFoo != NULL)){ICertFilter *a = pFoo->Filter;ICertificatesPtr certs = pFoo->MyCertificates;long temp = certs->Count;if(temp>0){for(int i=1;i<=temp;i++){_variant_t cert = certs->Item[i];ICertificatePtr date = (ICertificatePtr)cert.pdispVal;_bstr_t name = date->CommonName;((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(name);((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);}}else{((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(L"没有找到数字证书");((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);}}pFoo->Release();}pcf->Release();}FreeLibrary(hdllInst);//释放dll资源整个流程就是通过LoadLibrary()加载dll,然后IClassFactory去创建com组件实例。

Com组件技术

Com组件技术

COM组件技术1 COM组件概述 (3)2 COM组件实例 (3) (3)2.1.1 VC6.0 创建COM组件 (3) (7) (9)2.2.4 使用.Net(VB)调用 (11)2.2.5 使用.Net(C#)调用 (13)2.2 .NET(C#)创建的COM组件及调用过程 (15)2.1.1 C# 创建COM组件 (15) (20) (22)2.2.4 使用.Net(VB)调用 (23)2.2.5 使用.Net(C#)调用 (25)3 佳衡电力抄表Com组件.........................................................错误!未定义书签。

1 COM组件概述COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。

在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

COM组件的优点:①可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;②可以在多个应用系统中重复利用同一个组件;③可以方便的将应用系统扩展到网络环境下;④COM组件的特性是与语言无关和与平台无关。

因此,一经开发便可以使用不同的高级语言和开发工具调用。

并且,客源在此COM组件基础进行二次开发。

2 COM组件实例本部分将使用VC6.0创建COM组件。

并介绍如何在VC6.0、VB6.0、、C#中调用该COM组件。

2.1.1 VC6.0 创建COM组件1、在VC中新建“A TL COM AppWizard”工程,工程名称为“VCCOMTest”,并确认。

2、在服务器类型中,选择“动态链接库(DLL)”,完成3、选择菜单栏“插入”“A TL对象”,选择“Simple Object”,点击“Next”4、在上面C++“Short Name”后输入“COMTestInVC”,将会自动填充其余选项。

Attributes 部分按默认设置。

C#开发COM组件

C#开发COM组件

C#开发COM组件1、每个COM组件所有对外公布的⽅法都必须通过接⼝形式实现;2、由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运⾏⽬标机器注册的情况,对此.Net下编译的COM组件必须为程序进⾏签名,即强命名密钥;步骤:1、新建⼀个类库项⽬(⽂件—新建—项⽬—类库【命名:PBDemo】)2、针对“注意第⼀点要求”,新建⼀个接⼝⽂件(项⽬右键—添加—新建项—接⼝【命名:IHK.cs】)3、 IHK.cs接⼝⽂件编码:int TestFunction(int num, string str1, string str2, double db);4、将Class1.cs 改名为:HKTest.cs (这步其实很啰嗦,不过⽂档都整理了,就这样写吧)提⽰框点击“是”,如下图5、 HKTest.cs 类⽂件编码:添加名称空间:using System.Runtime.InteropServices;实现接⼝、并在类头添加属性:[ClassInterface(ClassInterfaceType.None)]。

如下图6、在“解决⽅案资源管理器”中找到节点“Properties”打开AssemblyInfo.cs⽂件如下图7、将[assembly: ComVisible(false)]属性改成[assembly: ComVisible(true)]如下图8、项⽬右键—属性、或者双击“Properties”节点,进⼊到项⽬属性设置界⾯ 8.1、选择“应⽤程序”选项卡,点击“程序集信息”按钮,如下图8.2、勾选“使程序集COM可见”,确定。

如下图8.3、选择“⽣成”选项卡,在底部“输出”栏⽬下,勾选“为COM互操作注册”。

如下图8.4、选择“签名”选项卡。

8.4.1、勾选“为程序集签名”; 8.4.2、在“选择强名称密钥⽂件”的下拉框选择“<新建…>” 8.4.3、在“密钥⽂件名称”输⼊:PBDemo.snk(任意命名,snk后缀即可) 8.4.4、去掉“使⽤密码保护密钥⽂件”,确定。

C#编写COM组件

C#编写COM组件

C#编写COM组件1、新建⼀个类库项⽬2、将Class1.cs改为我们想要的名字问是否同时给类改名,确定3、修改Properties⽬录下⾯的AssemblyInfo.csComVisible属性设置为True4、项⽬菜单->MyLib属性找到“⽣成”选项卡往下看,找到“为 COM Interop 注册”勾上5、继续往下,找到“签名”选项卡勾上“为程序集签名”在下⾯的下拉框⾥⾯选择“ <新建...>”6、在弹出的对话框⾥⾯,输⼊MyLib。

或者随便取个名字去掉使⽤密码保护⽂件的选项7、开始编码,任何⼀个公开的类,必须有⼀个 I开通的接⼝定义using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace MyLib { [ComVisible(true)] [Guid("2CBD3D76-35F1-4f9d-9C1B-9DBFEE412F76")] public interface IMyClass { void Initialize(); void Dispose(); int Add(int x, int y); } [ComVisible(true)] [Guid("EA2F140A-108F-47ae-BBD5-83EEE646CC0D")] [ProgId("MyLib.MyClass")] public class MyClass : IMyClass { public void Initialize() { //nothing todo } public void Dispose() { //nothing todo } public int Add(int x, int y) { return x + y; } }}8、GUID属性⾥⾯的那个字符串,在“⼯具”菜单下⾯,“创建 GUID”选择 Registry Format,然后复制注意在[Guid("....... 这个⾥⾯要去掉GUID前后的花括号9、编译它在命令提⽰符下⾯,进⼊Dll所在的⽬录⽤ gacutil /i MyLib.dll 将这个DLL加⼊的全局缓存⾥然后⽤ regasm MyLib.dll 注册这个dll10、在javsScript⾥⾯试试.。

实验1:编写COM组件并调用

实验1:编写COM组件并调用

实验1. 编写COM组件并调用实验内容在VS2010环境中,使用C#语言编写一个简单的COM组件,然后在 中调用COM组件。

实验目的◆掌握COM组件的编写◆学会调用COM组件环境要求VS2010实验指导(一)C#编写COM组件步骤1:创建C#类库,名称为CLCOMTestInCSharp,如下图:注意:如果在win7下,VS2010要以管理员的身份运行步骤2:在“解决方案资源管理器”中,类“Class1.cs”更名为“CAdd.cs”,并在弹出的对话框选项中选择“是”。

如下图:步骤3:添加接口“IAdd”,并使类“CAdd”继承接口“IAdd”,代码如下:步骤4:在文档最上方添加命名空间“using System.Runtime.InteropServices ”的引用语句。

步骤5:通过菜单“工具”、“创建GUID”创建GUID,如下图:步骤6:“IAdd”接口上方使用该GUID步骤7:同样的方法在类“CAdd”的上方再生成添加一个GUID步骤8:完整代码如下:步骤9:打开“解决方案资源管理器”,打开“AssemblyInfo.cs”,将[assembly: ComVisible(false)]设为true。

步骤10:右击该类库项目,选择“属性”“生成”,将“为COM互操作注册”选中。

如图:步骤11:右击项目,“生成”。

将生成“CLCOMTestInCSharp.dll”、“CLCOMTestInCSharp.tlb”、“CLCOMTestInCSharp.pdb”三个文件(二)中调用C#编写的COM组件步骤1:使用创建“Windows窗体应用程序”项目,命名为“COMTest”。

如下图:步骤2:在窗体上添加一个Button,并将其Text属性设为“使用 调用C#创建的COM组件”步骤3:将“CLCOMTestInCSharp.dll”复制到程序目录,添加引用,选择“浏览”,如下图:步骤4:双击“Button”按钮,添加如下代码:步骤5:执行程序,结果如下图所示:实验报告●简述:COM组件开发步骤记录各个步骤,并截图(注意:各种命名要不同于本实验指导中的命名,以示区别)●实习过程中的技术问题及解决方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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,项目类型为:类库程序代码: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文件图二COM生成设置程序代码:using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace AddCom{//可以通过//菜单的“工具/guid生成”。

//注意要选择De fine 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 hereint dresult;float fresult;CString strResult;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程序代码:接口: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;图三引用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 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 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,&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();}。

相关文档
最新文档