上古时代的COM组件
Win32 COM组件的挪用规范指明晰一个工具的虚函数表(vtable)的内存结构。若是语言/编译器希望支持某个COM组件,则它必须根据规范指明的结构来放置工具,否则就会失去COM组件的跨语言互操作性,也即:其他组件将不能正常的挪用这个组件。
Win32 COM组件的内存结构和C++工具的内存结构具有高度的一致性,这并非巧合。 只管COM最初被开发的时刻,C语言还占有着主导地位,COM的设计者就看到了COM组件对即将到来的C++十分”友好”。
一个COM组件的内存结构被界说在接口界说的头文件中。举个例子,下图的代码来自objidl.h,它界说了IPersist接口。为了利便旁观,我去掉了一些无关的宏。

我们来看它的内存结构:

这是什么意思呢?
一个COM接口指针,现实是一个指向上述结构体的指针,这个结构体里只界说了一个虚函数表,没有界说任何数据成员。虚函数表中包含了接口所支持的种种接口方式的指针。每个接口方式会将接口指针(上图中的p)作为它的第一个参数,也就是人人所熟悉的this指针。
黑魔法就在于,由于接口方式可以从它的第一个参数中获得接口指针,以是你可以在虚函数表中添加其他的器械,如下图所示:
--------------------------------------------------www.allbet8.us欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

位于虚函数表中的接口方式可以使用相对接口指针p的偏移来接见你所添加的器械,例如数据成员。
若是一个工具实现了多个接口,然则它们都继续自同一个祖先,则我们只需要一个单一的虚函数表就可以接见接口的所有成员。 举个例子,上面的工具可以被当做一个IUnknown接口或者一个IPersist接口,由于IUnknown是IPersist的父接口。
另一方面,若是一个工具实现了多个接口,然则不继续同一个祖先,则你就获得了一个多重继续,在这种情况下,工具的内存结构类似于下图:

我们来对上图做一个剖析。 若是你使用来自于第一个虚表的接口方式,则接口指针为p。 然则,若是你使用来自第二个虚表的接口方式,则接口指针为q。总结
我会在后面的文章中继续对上图举行一些分外的剖析,例如神秘的”adjustor thunks“。
请期待。最后
Raymond Chen的《The Old New Thing》是我异常喜欢的博客之一,内里有许多关于Windows的小知识,对于宽大Windows平台开发者来说,确实十分有辅助。
本文来自:《The layout of a COM object》

FiLecoin官网(www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。get到好看的点了
新2网址(www.x2w00.com)实时更新发布最新最快的新2代理线路、新2会员线路、新2备用登录网址、新2手机版登录网址、新2皇冠登录网址。还可以吧,挺用心
为了加速助力广东‘dong’培育若干具有全球竞争力的产业集群,以金融、媒体、风投、学术支持等各要素加速广东战略性产业集群建设,广东战略性产业集群发展论坛也于同期召开,来自学术界、实业界和投资界的专家大咖,将讲解产业政策、分享集群经验及投资方向。能看到这篇好幸运