首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么pUnkInner可以在COM的聚合中调用QueryInterface?

pUnkInner可以在COM的聚合中调用QueryInterface的原因是因为pUnkInner是一个内部对象,它被包含在COM的聚合对象中。在COM的聚合中,聚合对象可以通过内部对象的指针来调用内部对象的接口。

在COM中,聚合是一种对象组合的方式,其中一个对象(聚合对象)包含了另一个对象(内部对象)。聚合对象可以通过内部对象的指针来调用内部对象的接口,这样就可以实现对内部对象的访问和操作。

QueryInterface是COM接口中的一个方法,用于查询对象是否支持特定的接口。当pUnkInner在COM的聚合中调用QueryInterface时,它实际上是在查询聚合对象是否支持某个接口。如果聚合对象支持该接口,QueryInterface将返回该接口的指针,pUnkInner就可以通过该指针来调用接口中定义的方法。

总结起来,pUnkInner可以在COM的聚合中调用QueryInterface是因为它是聚合对象的内部对象,通过调用QueryInterface可以查询聚合对象是否支持某个接口,并通过返回的接口指针来调用接口中定义的方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

COM聚合技术QueryInterface

大家好,又见面了,我是你们朋友全栈君。 最近在看COM聚合技术时遇到一个关于QueryInterface问题。...COM技术内幕》还有这样一段话“COM并不关心接口名字是什么,而只关心vtbl结构。”这回是不是突然感觉好像明白了什么?...多重继承情况下,结构中会有多个基类虚函数表,比如上例,Derived类继承了Base1和Base2,那么其中就有2个虚函数表,我们调用虚函数时,会从对应虚函数表中进行查询: 多重继承...还有一个遗留小问题:虽然我们获取了NondelegatingUnknown指针,可是函数名不同为什么依然可以调用?还记得书中那句话么:“COM并不关心接口名字是什么,而只关心vtbl结构。”...NondelegatingUnknown和Unknown在结构上是相同传递给m_pUnknownInner时,发生了隐式转换,所以根据函数在内存位置,可以找到对应函数,而且,虚函数调用是运行时确定

89420

vuehtml标签{{}}内可以调用函数方法

今天领导提个需求,要求金额上强制保留两位小数,本想着后台直接返回数据时,带着两位小数,前端只是做个显示作用,后台说保留了小数但在传输过程中去掉了,可能他们做了格式转化。...没办法了只能又是我们前端操作了,牵扯价钱太多了,很多时候又有for 循环,怎么办呢? 思路:{{}}里面的是一个表达式,可不可以是个函数呢?...经测试是可以,具体实现方法如下: 写一个公共强制保留两位小数js方法 function toDecimal2 (x) { var f = parseFloat(x) if (isNaN(f....' } while (s.length <= rs + 2) { s += '0' } return s } export default { toDecimal2 } main.js...引用: import newPrice from '.

30.8K20
  • cuda核函数可以按地址调用普通变量么?

    请问cuda核函数可以按地址调用普通变量么?...但需要注意这个问题: (1)最终指向global memory地址空间指针,可以本次kernel启动,或者下次kernel启动任何线程中都是有效。...如果错误本次kernel启动本block其他线程使用,则自动得到被替换成对应线程对应local memory位置值。...另外两点需要注意: (4)部分平台支持P2P Access情况下,则指向一张卡global memory指针,可以另外一张卡上kernel中被使用,类似情况(1)。...(例如可以参考Pascal具有的显存作为缓存模式(可以看成GPUL3 cache,或者看成GPU支持虚拟内存---例如一张3GB的卡可以使用“虚拟“8GB显存,并且并非所有位置访问概率相同情况下

    3.2K70

    没想到吧,PHP 外部也可以调用私有方法!

    一般来说, Class 外部是无法调用私有方法,这也是 Private 字面的意思,但是一些很特殊很特殊情况下,如果需要调用,是否可以呢?其实可以使用类反射来实现。...getClosure($object); } return call_user_func_array($callback, $args); } 简单解释一下,首先还是简单判断该方法是否存在,接着获取对象方法放射...,然后判断一下是不是公共方法,如果是公共就正常调用,不是则获取其闭包,最后使用回调方式来调用。...这个函数可以让你调用对象私有或者受保护方法,建议一些特殊情况下才使用。为了方便大家调用,新版 WPJAM Basic 也会集成该函数。----

    1K30

    ATL源码学习3---接口查询支持

    ATLQueryInterface调用追踪 a....通过上面的函数调用追踪,我们可以发现函数最终是遍历_ATL_INTMAP_ENTRY数组结构。...:_Delegate主要用于聚合技术, //        和_Cache主要区别是需要客户手动创建内部组件对象,一般FinalConstruct创建内部对象 //2.相关宏:   a....:_Chain主要用于继承基类映射链表 //      从一个自己提供了接口映射表基类继承时,派生类接口映射表避免重复表项,方便维护 //2.相关宏:   COM_INTERFACE_ENTRY_CHAIN...(dw, func)/     {NULL, dw,func}, 这两个宏其实是ATLQueryInterface实现通用后门,用户可以自定义func,func函数暴露COM接口,但需要遵守COM

    75330

    COM简介

    COM定义了如何创建、使用和管理软件组件,这些组件可以不同应用程序之间共享。本文将深入探讨COM基本概念、工作原理、以及它在现代软件开发应用。...COM核心概念接口COM,接口是一组具有特定功能函数和方法集合。每个接口都由一个全局唯一标识符(GUID)标识。接口定义了对象可以执行操作,但不涉及具体实现细节。...组件可以是一个动态链接库(DLL)、一个可执行文件(EXE)或任何其他类型可执行代码。COM术语,组件通常被称为对象。引用计数COM使用引用计数来管理对象生命周期。...聚合和委托COM支持对象之间聚合,其中一个对象(称为控制对象)可以包含另一个对象(称为聚合对象)。控制对象将其客户端作为自己客户端,并将所有QueryInterface调用委托给聚合对象。...当客户端请求一个对象时,它首先获取类工厂接口指针,然后调用类工厂CreateInstance方法来创建对象。接口查询客户端可以通过QueryInterface方法请求对象不同接口。

    82300

    COMQueryInterface与NonDelegatingQueryInterface测试用例

    组件对象模型(COM)编程QueryInterface和NonDelegatingQueryInterface是用于接口查询和管理核心函数。...它们允许客户端获取对象不同接口,是COM机制关键部分。本文将详细介绍这两个函数测试用例设计和执行,以确保它们正确实现和行为。...QueryInterface函数QueryInterface是一个标准COM接口方法,它允许对象在被请求时提供其他接口指针。这个方法是多继承和接口聚合基础,使得对象能够支持多种接口。...return 0;}实际测试,每个测试用例都应该详细记录其执行步骤、预期结果和实际结果,以便于问题定位和修复。...通过这些测试用例执行,可以确保QueryInterface和NonDelegatingQueryInterface函数正确实现和行为,从而保证COM对象接口查询和管理机制稳定性和可靠性。

    89200

    COM对象创建

    组件对象模型(COM)是微软推出一种软件组件技术,它允许不同软件组件多种编程语言中被创建和调用。...COM对象创建是COM编程一个核心主题,涉及到类厂实现、对象实例化以及COM对象生命周期管理。...COM对象创建概述COM,对象创建通常涉及以下几个关键步骤:类厂获取:客户端首先需要获取一个类厂(Class Factory)实例,类厂负责创建特定类型COM对象。...对象实例化:通过类厂CreateInstance方法,客户端可以请求创建一个COM对象实例。接口指针获取:对象创建后,客户端通过接口指针与COM对象进行交互。...创建对象:客户端调用类厂CreateInstance方法创建COM对象实例。获取接口指针:客户端通过QueryInterface获取所需接口指针。

    73400

    QueryInterface本质初探

    为了实现该接口,COM给出了5个规则,具体可以参考《COM技术内幕》一书。 为了得到该问题答应,我们首先要分析一下C++类虚函数,以及这些虚函数如何在子类中被继承。...讲到这里,大家对QueryInterface为什么会返回相同IUnkown接口指针有所了解了吧!...从上面的例子可以知道,调用func时,如果真正调用是父类func实现,这时func中使用this指针就是指向sub父类实例空间;如果真正调用是CTestSub类实现func函数,则此时func...COMQueryInterface函数也就是使用了C++虚函数这一技术规则;只要COM组件类实现了QueryInterface接口函数,无论怎么调用该函数,该函数中使用this指针始终指向组件类实例...以上解释可以能比较啰嗦,但是看官要定下神来慢慢缕缕就能理解QueryInterface本质了,要通晓COM本质,这点必须弄明白,因为QueryInterfaceCOM来说实在是太重要了。

    39620

    COM 类厂和DllGetObjectClass函数

    组件对象模型(COM,类厂(Class Factory)和 DllGetClassObject 函数是创建和管理 COM 对象关键组件。...本文将深入探讨这两个概念,包括它们作用、实现方式以及 COM 编程应用。COM 类厂(Class Factory)类厂是 COM 对象生产基地,它负责创建特定类型 COM 对象。...DllGetClassObject 函数DllGetClassObject 函数是 COM DLL 组件入口点,它由 COM需要创建类厂对象时调用。...COM 类厂和 DllGetClassObject 重要性类厂和 DllGetClassObject 函数是 COM 架构不可或缺部分。...它们确保了 COM 对象创建是可控、可管理,并且遵循 COM 规则和约定。通过实现这些机制,开发者可以创建可重用、可管理 COM 组件,这些组件可以不同应用程序和进程中使用。

    79000

    使用C#编写.NET分析器-第三部分

    译者注 这是Datadog公司任职Kevin Gosse大佬使用C#编写.NET分析器系列文章之一,国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断)、IDE、诊断工具...使用C#编写.NET分析器-第二部分: https://mp.weixin.qq.com/s/uZDtrc1py0wvCcUERZnKIw 正文 第一部分,我们了解了如何使用 NativeAOT让我们用...从技术上讲,本可以从C++头文件自动生成这些代码,但是相同C++代码C#可以用不同方式翻译,因此了解函数目的以正确语义进行转换十分重要。 以 JITInlining函数为实际例子。...这就是为什么我们无法完全自动化这个过程。 将接口转换为C#之后,我们可以继续创建源代码生成器。...这就是为什么我们将完全限定名存储 interfaceName(= MyProfiler.ICorProfilerCallback),而仅将类型名存储 typeName(= ICorProfilerCallback

    22930

    使用C#编写.NET分析器-完结

    译者注 这是Datadog公司任职Kevin Gosse大佬使用C#编写.NET分析器系列文章之一,国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断)、IDE、诊断工具...正文 第1部分,我们了解了如何使用 NativeAOT让我们用C#编写性能分析器,以及如何暴露一个虚假 COM对象来使用性能分析API。...} 当调用 Initialize时,我们会收到一个 IUnknown实例。我们需要在其上调用 QueryInterface以检索到 ICorProfilerInfo实例。...最后,这只是一个带有一些嵌入式逻辑精美指针。 要调用这些方法,我们从 vtable相应槽检索它们地址,然后将它们转换为函数指针。...现在我们可以生成方法主体,从 vtable获取方法地址,并用预期参数调用它: invokerFunctions.AppendLine("{"); invokerFunctions.Append

    26030

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

    COM是基于组件化编程思想,COM每一个组件成为一个模块,它可以是动态链接库或者可执行文件,一个组件程序可以包含一个或者多个组件对象,COM对象不同于OOP(面向对象)对象,COM对象是定义二进制机器代码基础之上...而OOP对象是建立语言之上。脱离了语言对象也就不复存在.COM是独立在编程语言之上,是语言无关COM这一特性使得不同语言开发组件之间互相交互成为可能。...C++也就是做了一次强制类型转化。 对象和接口唯一标识 COM,对象本身对于客户来说是不可见,客户请求服务时,只能通过接口进行。...实际上,客户成功地创建对象后,它得到是一个指向对象某个接口指针,因为 COM 对象至少实现一个接口(没有接口 COM 对象是没有意义),所以客户就可以调用该接口提供所有服务。...函数ComCreateObject,会根据传入对应类ID,来生成对应类实例,然后调用实例QueryInterface,转化成对应接口,实现类实现了这个方法,实现类QueryInterface

    1.5K30

    OLEDB 调用存储过程

    除了常规调用sql语句和进行简单插入删除操作外,OLEDB还提供了调用存储过程功能,存储过程就好像是用SQL语句写成一个函数,可以有参数,有返回值。...存储过程使用 对于输出参数,绑定DBBINDING 结构时候,将结构eParamIO指定为DBPARAMIO_OUTPUT,调用存储过程可以使用类似下面的格式 {?...在上述代码,先定义了一个调用存储过程sql语句,接着ICommandText对象设置该存储过程,然后获取参数相关信息,然后绑定参数,提供输出、输出参数缓冲,然后执行存储过程获取结果集。...上面我们说过如果不释放返回结果集指针的话,是接收不到返回值,但是在这段代码好像在读取返回值之前没有释放返回IMultipleResults指针操作,但是还是可以取到结果集,这是为什么呢?...释放结果集代码函数ReadRowset,这里并没有列举出来。 最后:完整代码:请点击这里查看 ----

    1.8K10

    使用C#编写一个.NET分析器(二)

    正文 第一部分,我们看到了如何模仿COM对象布局,并用它来暴露一个假IClassFactory实例。...它运行得很好,但是我们解决方案使用了静态方法,所以需要处理多个实例时跟踪对象状态不太方便。如果我们能将COM对象映射到.NET一个实际对象实例,那就太好了。...我们可以使用它来检索我们托管对象并调用非静态版本方法。...(对于ClassFactory其他静态方法也是如此) } 构造函数,我们将ClassFactory实例添加到一个静态字典,并关联到相应本地对象地址。...静态QueryInterfaceNative方法,我们从静态字典检索该实例,并调用非静态QueryInterface方法。 这是可行,但每次调用方法时都要进行字典查找是很遗憾

    19630
    领券