首页
学习
活动
专区
工具
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时,发生了隐式转换,所以根据函数在内存中的位置,可以找到对应函数,而且,虚函数的调用是运行时确定

90120

在vue中的html标签{{}}内可以调用函数方法

今天领导提个需求,要求在金额上强制保留两位小数,本想着后台直接返回数据时,带着两位的小数,前端只是做个显示作用,后台说保留了小数但在传输过程中去掉了,可能他们做了格式转化。...没办法了只能又是我们前端操作了,牵扯价钱的太多了,很多时候又有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.9K20
  • 在cuda的核函数中可以按地址调用普通变量么?

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

    3.2K70

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

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

    1K30

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

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

    76730

    COM简介

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

    2.3K00

    COM的QueryInterface与NonDelegatingQueryInterface的测试用例

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

    2.3K00

    COM对象的创建

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

    2.3K00

    QueryInterface的本质初探

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

    40520

    使用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

    24330

    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 组件,这些组件可以在不同的应用程序和进程中使用。

    2.3K00

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

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

    1.6K30

    OLEDB 调用存储过程

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

    1.8K10

    使用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

    27030

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

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

    20030
    领券