首页
学习
活动
专区
工具
TVP
发布

COM组件原理_Com组件

COM中,接口就是一个抽象类,每个接口有一个接口ID(uuid)。一个COM组件通常是连续继承下来的类,比如 IUNknow ->IDispath->IXX->CXX。...这就形成了一个COM组件,当然组件一般是一个钻石继承的样子,这里为了简化原理把他们当成一个串形继承下来。...每个COM组件都有一个CLSID(uuid),这个CLSID是注册的时候写进注册表的,可以把这个CLSID理解为这个组件最终可以实例化的子类的一个ID。...这样就可以通过查询注册表中的CLSID来找到COM组件所在的dll的名称。然后调用的时候。...所以遇到COM组件的时候不要一根筋,非要纠结这个与标准的COM的不同之处。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

1.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

COM学习(一)——COM基础思想

COM对象和接口 COM中的对象类似于C++中的对象,对象是某个类中的实例。而类则是一组相关的数据和功能组合在一起的一个定义。使用对象的应用(或另一个对象)称为客户,有时也称为对象的用户。...在C++语言中,一个接口就是一个虚基类,而对象就是该接口的实现类,派生自该接口并实现接口的功能。...在C++中也就是做了一次强制类型转化。 对象和接口的唯一标识 在COM中,对象本身对于客户来说是不可见的,客户请求服务时,只能通过接口进行。...在最后分别调用各个接口的Release函数,释放接口 下面提供一个小例子,以供参考,也方便更好的理解COM //组件部分 extern "C" __declspec(dllexport) void...void AddRef() = 0; virtual void Release() = 0; }; static const GUID IID_ICOMSTRING = { 0xb2fcd22c,

1.3K30

COM学习(三)——COM的跨语言

COM是基于二进制的组件模块,从设计之初就以支持所有语言作为它的一个目标,这篇文章主要探讨COM的跨语言部分。...idl文件 一般COM接口的实现肯定是以某一具体语言来实现的,比如说使用VC++语言,这就造成了一个问题,不同的语言对于接口的定义,各个变量的定义各不相同,如何让使用vc++或者说Java等其他语言定义的接口能被别的语言识别...下面是具体的定义: const TCHAR *g_RegTable[][3] = { { _T("CLSID\\{EBD699BA-A73C-4851-B721-B384411C99F4}"),...DllCanUnloadNow:函数用来询问是否可以卸载对应的dll,一般在COM中有两个全局的引用计数,用来记录当前内存中有多少个模块中的类,以及当前有多少个线程在使用它,如果当前没有线程使用或者存在的对象数为...至此从结构上说明了为了实现跨语言COM组件内部做了哪些工作,当然只有这些工作是肯定不够的,后面会继续说明它所做的另一块工作——提供的一堆通用的变量类型。

1.7K40

COM编程_第一讲_深入COM框架以及实现简单的COM

二丶什么是COM COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。...那么就要有一个接口,这里我用C++来写了, 2.在写的过程中,我会依次的把为什么这样写,不能怎么写都会说清楚,最后开发一个跨语言使用的ATL(也就是COM)组件 3.下面的内容可能有点多,最后我会写总结...因为接口的设计都是用的指针,都是虚表去查(虚表是什么,可以补一下C++的基础,简单来说就是通过虚函数来调用的)如果一单你的接口的顺序改变了,那么对应的虚表就会改变, 举个例子:   比如你的插件(也就是咱们现在写的这个...从基本到高级的源码写出来,这样能熟悉一下COM的框架 接口设计的细节问题 (解决为什么要用Release) 1名称粉碎 .我们想一下,C语言的函数,看一下二进制或者DLL,是不是都是原本什么样子就是什么样子...C++的函数有一个语法支持重载了,内部怎么支持的重载,这就是一个问题 C++为了支持重载,会对你定义的函数做一个名称粉碎,也就是加了一些额外的符号,比如我们调试中都会遇到一种错误叫做,找不到外部符号

3.1K01

COM学习(二)——COM的注册和卸载

COM组件是跨语言的,组件被注册到注册表中,在加载时由加载函数在注册表中查找到对应模块的路径并进行相关加载。它的存储规则如下: 1....在注册表的HKEY_CLASSES_ROOT中以模块名的方式保存着COM模块的GUID,比如HKEY_CLASSES_ROOT\ADODB.Error\CLSID键中保存着模块ADODB.Error的GUID...-8000-00AA006D2EA4}\InprocServer32\项的默认键中保存着模块所在路径为%CommonProgramFiles%\System\ado\msado15.dll 一般的COM...DllRegisterServer(); STDAPI DllUnregisterServer(); 通过VS的F12功能查找STDAPI 的定义如下: #define STDAPI EXTERN_C...在C语言中我们说二维数组可以看做是由一维数组组成的,这个二维数组可以看成是由两个一维数组——一个由3个const TCHAR *成员组成的一维数组组成。

2.6K20

COM学习(四)——COM中的数据类型

上一次说到,COM为了跨语言,有一套完整的规则,只要COM组件按照规则编写,而不同的语言也按照对应的规则调用,那么就可以实现不同语言间相互调用。...1 - 严重故障 C - 第三方。 此位指定值是第三方定义还是Microsoft定义的。0 - Microsoft-定义,1 - 第三方定义 N - 保留部分设施代码。...COM为了方便使用,另外也提供了一组转化函数_com_util::ConvertBSTRToString以及_com_util::ConvertStringToBSTR用在在char与BSTR之间进行转化...VARIANT 万能类型 现代编程语言一般有强类型的语言和弱类型的语言,强类型的像C/C++、Java这样的,必须在使用前定义变量类型,而弱类型像Python这样的可以直接定义变量而不用管它的类型,甚至可以写出像...C++的基本类型都包含进来,甚至包含了像BSTR, 这样的COM中使用的类型。

99430

QueryInterface详解 COM

QueryInterface 接口查询 IUnknown: 所有的COM接口均需要继承IUnknown接口。...这是COM规范所要求的,而且从其本身来讲也是一种很好的做法。...=(IY*)this; 将this指针进行类型转换将会导致其值的改变,这一点主要是由于C++的实现方式。 一般在将this指针赋值给某个void指针时候,应先将其转化为合适的类型。...但是在代码中要保持一致,这是因为这两个指针是不一样的,并且COM要求对IUnknown接口返回相同的指针。...多生继承及类型转换 通常将一种类型的指针转化成为另外一种类型,并不会改变它的值,但是为了支持多重继承,在某些情况下,C++必须改变类指针的值。许多C++程序员并不清楚多重继承的此种负面效果。

86820

COM病毒实验原理

0×01 实验内容 编译生成com病毒,用com病毒对测试文件进行感染。 0×02 实验目的 了解COM病毒的原理,掌握COM病毒的分析及其修改过程。...0×04 实验步骤 进入目录C:\tools\asm20125目录 双击“setup”运行MASM的安装程序 按安装提示点击“下一步”执行安装程序 进入如教材图7所示,点击“安装”,即可安装MASM...SEGMENT ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG org 0100h start: NOP NOP NOP NOP CALL main MOV AX,04c00h...17所示界面,并在test文件夹中生成了virus的可执行程序 双击virus.exe使之运行,在没有test.com文件的情况下 将test文件夹中的test.asm文件改名为test.com文件...com virus 并且一直循环 这段话意思是: 你被一种概念com通讯病毒感染了 达到一定时间就开始全窗口出现表情 用到的工具MASM

15830
领券