怎么写com组件

1.如何开启com组件

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

在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块;等等。

COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。

开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。

并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。

并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。 COM所含的概念并不止是在Microsoft Windows操作系统下才有效。

COM并不是一个大的API,它实际上象结构化编程及面向对象编程方法那样,也是一种编程方法。在任何一种操作系统中,开发人员均可以遵循“COM方法”。

一个应用程序通常是由单个的二进制文件组成的。当编译器生成应用程序之后,在对下一个版本重新编译并发行新生成的版本之前,应用程序一般不会发生任何变化。

操作系统,硬件及客户需求的改变都必须等到整个应用程序被重新生成。 目前这种状况已经发生变化。

开发人员开始将单个的应用程序分隔成单独多个独立的部分,也既组件。这种做法的好处是可以随着技术的不断发展而用新的组件取代已有的组件。

此时的应用程序可以随新组件不断取代旧的组件而渐趋完善。而且利用已有的组件,用户还可以快速的建立全新的应用。

传统的做法是将应用程序分割成文件,模块或类,然后将它们编译并链接成一个单模应用程序。它与组件建立应用程序的过程(称为组件构架)有很大的不同。

一个组件同一个微型应用程序类似,即都是已经编译链接好并可以使用的二进制代码,应用程序就是由多个这样的组件打包而得到的。单模应用程序只有一个二进制代码模块。

自定义组件可以在运行时刻同其他的组件连接起来以构成某个应用程序。在需要对应用程序进行修改或改进时,只需要将构成此应用程序的组件中的某个用新的版本替换掉即可。

COM,即组件对象模型,是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。 使用组件的优点: 组件架构的一个优点就是应用可以随时间的流逝而发展进化。

除此之外,使用组件还有一些可以使对以有应用的升级更加方便和灵活的优点,如应用的定制,组件库以及分布式组件等。 使用组件的种种优点直接来源于可以将它们动态的插入或卸出应用。

为了实现这种功能,所有的组件必须满足两个条件:第一,组件必须动态链接;第二,它们必须隐藏(或封装)其内部实现细节。动态链接对于组件而言是一个至关重要的要求,而消息隐藏则是动态链接的一个必要条件。

补充:COM组件由以Win 32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码所组成。遵循COM规范编写出来的组件将能够满足对组件架构的所有要求。

COM组件可以给应用程序、操作系统以及其他组件提供服务;自定义的COM组件可以在运行时刻同其他组件连接起来构成某个应用程序;COM组件可以动态的插入或卸出应用。 恶意网站可以利用含有漏洞的com组件接口,下载木马,并且执行; 禁用com组件一般是指设置了Kill位,即IE浏览器不能使用这个组件,通俗讲:通过设置Kill位,可以使InternetExplorer在使用默认设置时永不调用被禁用的com组件,从而禁止该控件在Internet Explorer中运行。

禁用含有漏洞的com组件后,IE就不能调用含有漏洞的COM组件;黑客利用有漏洞的COM组,写成的网页代码就不能在IE中被执行,木马等将不会被下载。 禁用com组件可能导致的问题: 在线播放功能的组件被禁用,会导致在线电影等在线视频无法正常观看; 在线杀毒功能的组件被禁用,会导致在线杀毒不能使用; 在线游戏功能的组件被禁用,会导致在线游戏无法玩, com组件禁用后的具体情况,需要根据具体的com组件功能作判断。

手动启动COM组件操作方法: 运行——regedit——找到被禁用的com组件对应的clsid|注册表键值——删除具体值,或者整个键。

2.DELPHI怎样编写COM组件

那这个规范是什么呢,最简单的,就是按规定使用接口,微软定了个IUnkown接口,只要实现了这个接口的类,就可以称为COM组件。

在此基础上可以加上自己的接口,实现特定的功能,这就成了有用的COM组件了。 2、DELPHI中如何创建COM组件 两个步骤: (1)创建一个ActiveX Library,这是个DLL (2)创建一个COM Object或者Automation Object,二者选其一,这两者都是COM组件,但是当然还是有区别的,差在调用的方法上,这个后面再说 3、DELPHI中如何调用COM组件 两种方法,分别是用接口来调和用名称来调,第一种适用于支持接口的语言,如C、DELPHI,VB就不行了,好处是速度快,因为不用根据名称去查找了,还有开发时编译器能检查,缺点是要导入类型库。

第二种适用于所有的语言,好处是不用导入类型了,缺点是调用的速度慢,还有开发时编译器不检查。 前面说的COM Object只能通过第一种方法调,Automation Object两种方法都可以调。

举例如下: 我创建了一个ActiveX Library,名叫mylib。一个Automation Object,名叫myobj。

并且编译注册过了。 用第一种方法调用时,需要如下操作:在use里加上mylib_TLB类型库(如果不是自己开发的没有TLB可以从DLL导入生成的),代码是var myobj:Imyobj;myobj=Comyobj.create();之后就可以用了。

如果有兴趣可以看看类型库的代码里,Comyobj.create里调用了CreateComObject,这函数返回的是IUnkown接口,再用as操作转成你需要的Imyobj接口。 用第二种方法不需要类型库了,代码是var myobj:variant;myobj=CreateOleObject('mylib.myobj');之后就可以用了,这个方便吧。

3.用C++编写一个com组件,组件上有接口,怎么编

下面提供一个完全用C++实现的进程内(DLL)COM服务器,不要ATL或MFC提供任何支持。

用这种方式编写COM对象可以让你深入地洞察到COM处理进程内服务器的方法以及COM是如何创建类工厂的。利用本文提供的这个简单框架你可以实现很基本的COM组件,如外壳扩展(Shell Extensions)等。

以下是用本文所说的方式编写自己的COM对象要经过的步骤: 第一步:写一个头文件,这个头文件包含以下内容: 1、包含文件comdef.h:#include 。 2、定义COM服务器的GUID。

_declspec(selectany) GUID CLSID_Mine = { 0xdc186800, 0x657f, 0x11d4, {0xb0, 0xb5, 0x0, 0x50, 0xba, 0xbf, 0xc9, 0x4} }; 3、给出接口的IID以及这个接口要实现的方法定义。到时客户端会用到这个接口的IID和接口的方法。

interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904")) ImyInterface : public IUnknown { STDMETHOD(Square)(long *pVal)PURE; STDMETHOD(Cube)(long *pVal)PURE; }; 客户端使用此接口: HRESULT hr; ImyInterface *pmine=(0); hr = CoCreateInstance(CLSID_Mine, // COM 服务器的CLSID NULL,//不支持聚合 CLSCTX_INPROC_SERVER, // 是个DLL __uuidof(ImyInterface), // 接口的IID (void**)&pmine ); 还有一种方法可以从注册表中获得COM对象的CLSID,就是调用CLSIDFromProgId()函数,不过必须把组件的ProgId传递给这个函数。 第二步:必须为所定义的接口提供实现,本文用的方法是创建一个从接口继续的新类: // 这个类实现单接口ImyInterface 。

// // class CmyInterface : public CComBase , public InterfaceImpl { public: CmyInterface(); virtual ~CmyInterface(); // 我们必须要为QueryInterface 编写代码 STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv); // ImyInterface 接口方法 STDMETHOD(Square)(long *pVal); STDMETHOD(Cube)(long *pVal); }; 模版类InterfaceImpl提供接口引用计数的实现。在此我们可以用多接口继续,那样就能在一个COM组件中实现多个接口。

第三步:在完成这个对象之前,我们还要编写Queryinterface和两个接口方法: STDMETHODIMP CmyInterface::QueryInterface(REFIID riid,LPVOID *ppv) { *ppv = NULL; if(IsEqualIID(riid,IID_IUnknown) IsEqualIID(riid,__uuidof(ImyInterface))) { // 因为我们从ImyInterface继续,所以要进行强制类型转换 *ppv = (ImyInterface *) this; _AddRef(); // 这个方法从某个基类继续而来 return S_OK; } return E_NOINTERFACE; } STDMETHODIMP CmyInterface::Square(long *pVal) { long value = *pVal; *pVal = value * value; return S_OK; } STDMETHODIMP CmyInterface::Cube(long *pVal) { long value = *pVal; *pVal = value * value * value; return S_OK; } 注重这里使用了__uuidof(ImyInterface)来获取接口的IID,这是因为我们已经在第一步中将这个接口关联到了某个uuid。 最后一步:COM 组件的DLLs必须输出一个叫DllGetClassObject的函数。

由这个函数为CmyInterface创建类工厂并返回一个对它的引用。然后我们调用CoCreateInstance为进程内COM创建类工厂,接着调用DllGetClassObject。

这个类工厂有一个方法是CreateInstance,由这个方法创建对象并返回对它的引用。 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut) { *ppvOut = NULL; if (IsEqualIID(rclsid, CLSID_Mine)) {// 为CmyInterface类声明类工厂 CClassFactory *pcf = new CClassFactory; return pcf->QueryInterface(riid,ppvOut); } return CLASS_E_CLASSNOTAVAILABLE; } 在此我们要检查所请求的CLSID是不是CLSID_Mine,假如不是则返回一个错误代码。

你可能会问在哪里创建实际的CmyInterface类对象,实际上这是由CClassFactory的模板实例来处理的。以下是CClassFatory的实现: // CSingleCreator 用于单实例类工厂,这个类为多个CreateObject请求返回相同的对象指针.. template class CSingleCreator { protected: CSingleCreator():m_pObj(0) {}; comObj *CreateObject() { if(!m_pObj) { m_pObj = new comObj; } return m_pObj; } comObj * m_pObj; }; // CMultiCreator 用于常用类工厂,这个类为每一个CreateObject请求返回新的对象指针.. template class CMultiCreator { protected: CMultiCreator():m_pObj(0) {}; comObj *CreateObject() { return new comObj; } comObj * m_pObj; }; //ClassFactory类实现 // MultiCreator是缺省的类工厂创建者 //这个类实现了接口IclasFactory。

class CClassFactory : public CComBase, public InterfaceImpl, public creatorClass { public: CClassFactory() {}; virtual ~CClassFactory() {}; STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv) { *ppv = NULL; if(IsEqualIID(riid,IID_IUnknown) IsEqualIID(riid,IID_IClassFactory)) { *ppv = (IClassFactory *) this; _AddRef(); return S_OK; } return E_NOINTERFACE; } STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) { *ppvObj = NULL; if (pUnkOuter) return CLASS_E_NOAGGREGATION; m_pObj = CreateObject(); 。

4.如何编写 VC++代码来使用COM组件

为了帮助读者更快地体会到使用VC++编写COM client的效果,我建议您从上诉链接中下载最新的release,并按照如下步骤搭一个简单的测试环境:

Step1. 使用Visual Studio 2008打开CodeFx的solution文件(Visual Studio需要run as admin)。

Step2. Build其中的CppCOMClient和MFCCOMClient示例。由于项目依赖性的设置,这两个VC++ example所依赖于的COM组件(CSDllCOMServer, ATLDllCOMServer, ATLExeCOMServer)也会被编译并注册。

Step3. 直接运行CppCOMClient,并得到如下输出。CppCOMClient演示的是使用native C++来创建和使用进程内COM组件。这个COM组件既可以是用native代码写的,也可以是用.NET语言写的。

Step4. 直接运行MFCCOMClient,并得到如下输出。MFCCOMClient演示的是使用MFC的class wizard来创建并使用一个进程外的COM组件。

简单的测试到此结束。下面我们来看看编写一个VC++的程序来使用COM组件的一般方法:方法一:直接使用COM API,例如,CoCreateInstance以及IDispatch接口中定义的方法GetIDsOfNames,Invoke来创建和使用COM组件。当然,前提是那个COM组件支持IDispatch。CodeFx/CppCOMClient/RawAPI.cpp是该方法所对应的例子。

方法二:使用VC++的#import directive,导入目标COM组件的type library并自动生成一套包装好的强类型的类和智能指针。这极大程度地方便了开发人员,因为生成的类和智能指针将复杂的COM API,类型转换等内容都隐藏了起来,同时开发者还可以受益于Visual Studio的intellisense。CodeFx/CppCOMClient/ImportDirective.cpp是该方法所对应的例子。另外,值得注意的是,这个例子演示了使用一个.NET 写的COM组件(CSDllCOMServer)。对于.NET写的COM组件,我们额外需要#import mscorlib.tlb。

方法三:如果您开发的程序支持MFC,那您将更大程度地得益于MFC强大的class wizard。这个class wizard将方法二中的#import directive都封装隐藏了。您只需轻点几下鼠标,便可以无缝透明地创建和使用COM组件,就好像他是一个普通的class一般。

5.C#中怎么使用C++写的COM组件

1、新建一个C# console项目,比如叫Test(winform的也是一样道理,只是Console调试更方便而已。

第一次在C#中调用COM组件时,建议先用Console试试,否则会搞得一头烟)2、添加引用:在弹出的对话框中选COM子页,找到ATLProjectTest 1.0类型库(或类似的东西)就会发现在Test->引用下多了ATLProjectTestLib3在主函数(program.cs)中调用组件using System;using System.Collections.Generic;using System.Linq;using System.Text;using ATLProjectTestLib;namespace Test{ class Program{ static void Main(string[] args){ATLProjectTestLib.FunTestClass f1 = new FunTestClass();Console.Write (f1.Sum(3,4));}} }。

怎么写com组件

转载请注明出处育才学习网 » 怎么写com组件

知识

婕的小篆怎么写

阅读(227)

本文主要为您介绍婕的小篆怎么写,内容包括婕字篆体怎么写,利字篆体怎么写,小篆字婕怎么写,骞的小篆怎么写。倪字小篆写法:

知识

卫字篆体怎么写

阅读(262)

本文主要为您介绍卫字篆体怎么写,内容包括“卫”字小篆写法,卫字篆字反写怎么写,卫字用小篆怎么写。卫字的繁体字:

知识

聘用意见怎么写

阅读(227)

本文主要为您介绍聘用意见怎么写,内容包括聘用单位意见怎么写,聘用单位意见怎么写,用人单位意见怎么写。同意就业填写“同意”即可。须注意的是学校同意盖章这一步一定要最后执行以保护学生的权益高校毕业生就业必须由毕业生、用人单位和学

知识

走a怎么用

阅读(176)

本文主要为您介绍走a怎么用,内容包括lol中,走A的作用是什么,LOL怎么用A键走A,LOL如何设置走a有什么用或者说不用设置那怎么走a。利用攻击间隔移动,在不浪费输出的前提下更好的进行追杀或者走位,走砍就是普攻一下走一步,详细点就是能提升点人的

知识

有钱怎么用

阅读(199)

本文主要为您介绍有钱怎么用,内容包括有钱怎么用,有钱了怎么用最好,有钱要怎么用。所以如果你想加入有钱人的行列,当务之急就是对自己进行一次彻彻底底的改造。虽然在当前你可能还并不是一位有钱人,但却要培养自己致富的欲望,学

知识

怎么用u盘装机

阅读(198)

本文主要为您介绍怎么用u盘装机,内容包括如何用u盘装机,怎么用U盘装机,怎么用U盘重装系统。U盘做启动盘不是很容易,先看主板是否支持,U盘是否支持, U盘如果支持,到网上下一个专做U盘启动盘的程序,用它可以很方便的做出一个启动盘

知识

耳机线夹怎么用

阅读(275)

本文主要为您介绍耳机线夹怎么用,内容包括耳机线夹怎么用,耳机自带的夹子怎么用,耳机线夹怎么用绕线器怎么弄。工具/原料:耳机线夹。首先准备好一个耳机线和一个耳机线夹。

知识

旅游心得体会怎么写

阅读(226)

本文主要为您介绍旅游心得体会怎么写,内容包括旅游心得体会,旅游后的感想怎么写,如何写旅游后的心得体会。原发布者:liu33810761 旅游心得体会 旅游是一种在辛苦和疲惫中寻找快乐和放松并增长见识的经历。是增长见识和经验的好机会。古人

知识

定格动画脚本怎么写

阅读(284)

本文主要为您介绍定格动画脚本怎么写,内容包括如何制作定格动画~如何用flash制作定格动画~,动画脚本怎么写啊,怎样做定格动画,。故事和脚本 一个吸引人的故事是一部动画片的基础。定格动画由于制作上的繁琐,往往不适合情节复杂的宏篇巨作。

知识

刘字用小篆怎么写

阅读(0)

本文主要为您介绍刘字用小篆怎么写,内容包括刘字用篆书怎么写,刘字用篆书怎么写,薛振华的小篆如何写。【徐微强】的【方正小篆体】写法

知识

用vs2013怎么写c程序

阅读(234)

本文主要为您介绍用vs2013怎么写c程序,内容包括用VS2013如何编写C语言,怎么用vs2013编写C语言求详细的步骤,越详细越好,请问用vs2013写c语言程序。步骤如下:首先打开vs2013,我们发现有 新建项目 和 打开项目 的选项,我们选择新建项目。

知识

蒲的笔画怎么写

阅读(224)

本文主要为您介绍蒲的笔画怎么写,内容包括蒲的笔画顺序怎么写,蒲的笔顺怎么写,有谁知道蒲字的简笔怎么写。蒲的笔顺:横、竖、竖、点、点、提、横、竖、横折钩、横、横、竖、点。蒲的拼音:pú基本信息:部首:艹,四角码:4412786五笔:aigy

知识

海淘直邮地址怎么写

阅读(203)

本文主要为您介绍海淘直邮地址怎么写,内容包括海淘直邮地址英文怎么写,海淘地址怎么填写,unineed海淘直邮地址怎么填。以手机海淘为例,填写方法如下:打开海淘APP,选择主页面下方“我的海淘”。2、跳转到个人信息页面后,点击右上角齿轮标志,进入

知识

姐嫁女红包怎么写

阅读(191)

本文主要为您介绍姐嫁女红包怎么写,内容包括嫁女贺礼红包怎么写,同事嫁女贺礼红包怎么写,嫁女红包称呼怎样写。结婚红包贺词写法结婚送礼的话,要看你是结婚哪一方的亲戚朋友,如果你是男方的,可以写贺仪,如果是送女方的就要写奁仪. 贺仪一般红喜

知识

vue.js组件怎么写

阅读(191)

本文主要为您介绍vue.js组件怎么写,内容包括前端面试,被问到vue的组件是怎么写,我怎么回答,如何正确使用Vue.js的组件,如何正确使用Vue.js的组件。定义一个组件// title.vue{{title.title}}<script>export default {props: {tit

知识

vue组件怎么写

阅读(184)

本文主要为您介绍vue组件怎么写,内容包括前端面试,被问到vue的组件是怎么写,我怎么回答,vue怎么在组件里写methods,vue动态组件子组件之间怎么传值。作用域:它是指对某一变量和方法具有访问权限的代码空间,在JS中,作用域是在函数中维护的。表

知识

怎么写组件

阅读(163)

本文主要为您介绍怎么写组件,内容包括前端面试,被问到vue的组件是怎么写,我怎么回答,动态创建组件,怎么写他的事件呢,易语言动态创建组件怎么给创建的组件写代码。一般把Control翻译成控件,把Component翻译成组件。控件就是具有用户界面的组

知识

组件怎么写

阅读(157)

本文主要为您介绍组件怎么写,内容包括“借用”怎么翻译如:弹簧下座组件借用这里的“组件”“借用,动态创建组件,怎么写他的事件呢,前端面试,被问到vue的组件是怎么写,我怎么回答。这是一个HTML标签,即select和option。然后在给select加上一个

知识

三星手机天气小组件被禁用当前城市怎么办

阅读(270)

查看天气情况:1.添加天气小组件:待机桌面点住空白位置不松手,屏幕下方选择小组件,滑动屏幕选择天气小组件,点住拖动到主屏幕;2.添加城市:添加天气小组件后,在主页面上点击天气小组件,在出现的页面上点击加号,即可搜索添加城市;3.也可下载安装第三方

知识

QQ安全组件异常是怎么回事

阅读(280)

原因如下:1.可能是计算机感染了木马病毒;2.可能是某些安全类软件误删除了QQ安全组件导致。解决方法如下:1.使用专业杀毒软件彻底查杀木马并修复系统漏洞;2.在确认安全的环境下,重新下载安装QQ;3.修改QQ密码。

知识

我的世界组件怎么用

阅读(205)

本文主要为您介绍我的世界组件怎么用,内容包括我的世界中国版怎么加MOD中国版功能组件怎么安装,我的世界中国版组件怎么使用中国版组件安装使用详解,我的世界中国版功能组件怎么用网易国服mod插件如何安装。《我的世界中国版》加MOD方法详

知识

win10组件服务在哪

阅读(201)

找win10组件服务步骤如下:1.点击打开开始菜单,找到并点击“控制面板”;2.点击查看方式为“大图标”,然后点击打开“程序和功能”进入下一步操作;3.点击打开左侧的“启用或关闭windows功能”进入下一步操作;4.在windows功能窗口,即可看到win10组

[/e:loop]