Allbet

usdt支付(caibao.it):浅谈COM工具的内存结构

Allbet登录网址 2020年12月03日 科技 87 0
2020-12-02 23:11 漫漫开发路

上古时代的COM组件

Win32 COM组件的挪用规范指明晰一个工具的虚函数表(vtable)的内存结构。若是语言/编译器希望支持某个COM组件,则它必须根据规范指明的结构来放置工具,否则就会失去COM组件的跨语言互操作性,也即:其他组件将不能正常的挪用这个组件。

Win32 COM组件的内存结构和C++工具的内存结构具有高度的一致性,这并非巧合。 只管COM最初被开发的时刻,C语言还占有着主导地位,COM的设计者就看到了COM组件对即将到来的C++十分”友好”。

一个COM组件的内存结构被界说在接口界说的头文件中。举个例子,下图的代码来自objidl.h,它界说了IPersist接口。为了利便旁观,我去掉了一些无关的宏。

usdt支付(caibao.it):浅谈COM工具的内存结构 第1张

我们来看它的内存结构:

usdt支付(caibao.it):浅谈COM工具的内存结构 第2张

这是什么意思呢?

一个COM接口指针,现实是一个指向上述结构体的指针,这个结构体里只界说了一个虚函数表,没有界说任何数据成员。虚函数表中包含了接口所支持的种种接口方式的指针。每个接口方式会将接口指针(上图中的p)作为它的第一个参数,也就是人人所熟悉的this指针。

黑魔法就在于,由于接口方式可以从它的第一个参数中获得接口指针,以是你可以在虚函数表中添加其他的器械,如下图所示:

-------------------------

欧博网址

www.allbet8.us欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、 *** 开户、电脑客户端下载、苹果安卓下载等业务。

-------------------------

usdt支付(caibao.it):浅谈COM工具的内存结构 第3张

位于虚函数表中的接口方式可以使用相对接口指针p的偏移来接见你所添加的器械,例如数据成员。

若是一个工具实现了多个接口,然则它们都继续自同一个祖先,则我们只需要一个单一的虚函数表就可以接见接口的所有成员。 举个例子,上面的工具可以被当做一个IUnknown接口或者一个IPersist接口,由于IUnknown是IPersist的父接口。

另一方面,若是一个工具实现了多个接口,然则不继续同一个祖先,则你就获得了一个多重继续,在这种情况下,工具的内存结构类似于下图:

usdt支付(caibao.it):浅谈COM工具的内存结构 第4张

我们来对上图做一个剖析。 若是你使用来自于第一个虚表的接口方式,则接口指针为p。 然则,若是你使用来自第二个虚表的接口方式,则接口指针为q。总结

我会在后面的文章中继续对上图举行一些分外的剖析,例如神秘的”adjustor thunks“。

请期待。最后

Raymond Chen的《The Old New Thing》是我异常喜欢的博客之一,内里有许多关于Windows的小知识,对于宽大Windows平台开发者来说,确实十分有辅助。

本文来自:《The layout of a COM object》

usdt支付(caibao.it):浅谈COM工具的内存结构 第5张 Allbet声明:该文看法仅代表作者自己,与www.allbetgame.us无关。转载请注明:usdt支付(caibao.it):浅谈COM工具的内存结构
发布评论

分享到:

usdt无需实名(caibao.it):最初的相遇,最后的分别:现在的电视剧名字都这么庞大吗
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。