COM技术の接口

什么是接口
DLL的接口可以理解为其导出的那些函数,C++类的接口则是该类的一个成员函数集。
对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址。对COM而言,接口就是这样的一个内存结构,无关细节与具体语言实现。(即不管是C#还是C++实现,只要给我这么个内存结构,我就认为你是一个接口)
接口的作用
接口对COM来说很总要!只需记住下面三点:
(1)COM中接口就是一切。
(2)对客户而言,一个组件就是一个接口集合(客户通过QueryInterface获取想要的接口)。
(3)客户只能通过接口与COM组件打交道。
COM接口在C++中的代码实现
参加COM中接口的定义,在C++中,可以通过抽象基类来实现COM接口。
抽象基类,其实是定义了一个内存结构,抽象基类仅包含虚函数,因此其包含虚表与虚指针。如下图所示,抽象基类如

interface IX  

{  

     virtual void STDMETHODTYPE Fx1()=0;  

     virtual void STDMETHODTYPE Fx2()=0;  

     virtual void STDMETHODTYPE Fx3()=0;  

}  

其在内存中仅包含一个虚指针,而这个虚指针则指向一组虚函数的实现列表(函数指针数组)。这刚好符合COM对接口的定义。
因此COM接口在C++中的实现是通过抽象基类实现的。子类继承抽象父类,并实现或重写抽象函数。子类同时也就继承了这种内存结构,即子类获得了向客户提供这种接口的提供能力,同时对于组件对于多个接口的支持,可以通过让子类多重继承抽象父类来实现。
 
一些细节
1、标准调用约定
在Microsoft平台上,COM接口提供的所以函数均遵循PASCAL调用约定,即函数将在返回到调用者之前进行参数的出栈处理。因此接口中的函数均有修饰符__standcall 或STDMETHODCALL
2、C++中接口虽然是抽象基类实现,但可以不用class来声明类,而是用OBJBASE.H中定义的宏
posted @   卖雨伞的小男孩  阅读(261)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示