首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏全栈程序员必看

    QueryInterface函数

    《COM技术内幕》 §3 —— QueryInterface函数 §3 —— IUnknown.CPP代码清单: // //IUnkown.cpp // // #include <iostream.h public IX, public IY { //IUnknown implementation virtual HRESULT __stdcall QueryInterface void** ppv) { if(iid == IID_IUnknown) { trace(“QueryInterface IX* >(this); } else if(iid == IID_IX) { trace(“QueryInterface IX* >(this); } else if(iid == IID_IY) { trace(“QueryInterface

    53030编辑于 2022-09-07
  • 来自专栏全栈程序员必看

    有关QueryInterface函数

    函数 { QueryInterface函数 IX * pIX = NULL; QueryInterface函数 QueryInterface函数 HRESULT hr = pI->QueryInterface (IID_IX,(void **)pIX); QueryInterface函数 QueryInterface函数 if(SUCCEEDED(hr)) QueryInterface函数有关QueryInterface 函数 { QueryInterface函数 pIX->FX(); QueryInterface函数 } QueryInterface函数} QueryInterface函数 * ppv) QueryInterface函数有关QueryInterface函数 { QueryInterface函数 if(iid == IID_IUnknown) QueryInterface } QueryInterface函数 else if(iid == IID_IX) QueryInterface函数有关QueryInterface函数 { QueryInterface

    65520编辑于 2022-06-25
  • 来自专栏全栈程序员必看

    QueryInterface详解 COM

    QueryInterface 接口查询 IUnknown: 所有的COM接口均需要继承IUnknown接口。 由于所有的COM接口都继承了IUnknown,每个接口的vbtl的前三项都是QueryInterface,AddRef,Release(如图1所示)。 ,我们将pIX初始化为NULL,这是一种比较好的编程习惯,但由于QueryInterface是由程序员而不是由系统实现的,因此在查询失败的时候,将此指针置为NULL. ; 类CA及其接口的继承关系如图(2): QueryInterface(const IID& iid,void**ppv); //注意由QueryInterface 返回的IUnknown指针一定要和 (IID_IY,(void**)&pIY); if(SUCCEEDED(hr)) { hr=pIY->QueryInterface(IID_IX,(void**)&pIX2); //QueryInterface

    1.5K20编辑于 2022-09-07
  • 来自专栏全栈程序员必看

    QueryInterface 的实现规则

    本节将给出一些QueryInterface既的所有实现都必须遵循的一些规则,以便客户能够获取关于组件的足够多的知识并对之施实一些控制和其他有用的处理。 如果没有这些规则,是不可能编写出组件的,因为在这种情况下,QueryInterface的行为将是不确定的。具体来讲,这些规则是: QueryInterface返回的总是同一 IUnknown指针。 IUnknown * pI1 = NULL; IUnknown * pI2 = NULL; // 从PIX得到IUnknown接口 pIX -> QueryInterface (IID_IUnknown,( void ** ) & pI1); // 从pIY得到IUnknown接口 pIY -> QueryInterface(IID_IUnknown GetInterAgain(IX * pIX) { IX * pIX2 = NULL; // 从IX查询IX接口 HRESULT hr = pIX -> QueryInterface

    45820编辑于 2022-09-15
  • 来自专栏全栈程序员必看

    QueryInterface IID_IDispatch

    STDMETHODIMP CMathFactory::QueryInterface(REFIID riid,void ** ppv) { *ppv=NULL; if(riid==IID_IUnknown *>(*ppv)->AddRef(); return S_OK; } else return (*ppv=0),E_NOINTERFACE; } STDMETHODIMP CMath::QueryInterface

    32110编辑于 2022-09-15
  • 来自专栏全栈程序员必看

    QueryInterface的本质初探

    QueryInterface接口对COM的重要性不言而喻,该接口的实现有个规则——由QueryInterface返回的IUnknow接口指针必须相同,我的疑问是微软是如何使用C++实现这一COM规则的呢 这个问题的回答归总如下: 实现组件的类实现了IUnkown中的虚函数QueryInterface,这一点保证实现组件的类维护的虚表VTBL中存储的是该类中实现的QueryInterface函数地址,而不是父类中的 QueryInterface函数地址。 COM的QueryInterface函数也就是使用了C++虚函数的这一技术规则;只要COM组件类实现了QueryInterface接口函数,无论怎么调用该函数,该函数中使用的this指针始终指向组件类的实例 以上解释可以能比较啰嗦,但是看官要定下神来慢慢缕缕就能理解QueryInterface的本质了,要通晓COM本质,这点必须弄明白,因为QueryInterface对COM来说实在是太重要了。

    59320编辑于 2022-09-15
  • COM的QueryInterface与NonDelegatingQueryInterface关系

    IUnknown接口和QueryInterface在COM中,每个接口都继承自IUnknown接口,IUnknown提供了三个基本方法:QueryInterface、AddRef和Release。 其中,QueryInterface方法允许客户端查询对象是否支持特定的接口。 在这种情况下,外部对象的QueryInterface方法通常会委托给内部对象的QueryInterface方法,以确保正确的接口查询和引用计数管理。 QueryInterface与NonDelegatingQueryInterface的关系在非聚合场景下,对象的QueryInterface方法通常直接调用NonDelegatingQueryInterface 但在聚合场景下,内部对象的QueryInterface方法会委托给外部对象的QueryInterface,而外部对象的NonDelegatingQueryInterface则处理自己的接口查询。

    4.7K00编辑于 2024-10-13
  • 来自专栏全栈程序员必看

    COM聚合技术中的QueryInterface

    最近在看COM聚合技术时遇到一个关于QueryInterface的问题。在《COM技术内幕》和《COM原理与应用》中都是寥寥数句带过,看起来很易理解,我却看了许久才有所领悟。 (const IID& iid, void** ppv) { return m_pUnknownOuter->QueryInterface(iid, ppv); } 现在假设外部组件CB实现了接口 ,通过上述代码来看,理论上应该会调用CA::QueryInterface(),而根据QueryInterface的实现,又会调用回外部组件的查询函数CB::QueryInterface(),从而形成了一个死循环 而实际运行当然不会出现这种情况,在查询IY接口时,会调用NondelegatingQueryInterface而非QueryInterface!原因何在? 简单来说,问题是明明调用了QueryInterface函数,结果却是调用了NondelegatingQueryInterface。

    1.3K20编辑于 2022-09-15
  • 来自专栏全栈程序员必看

    COM :IUnknown接口QueryInterface函数介绍

    2、QueryInterface功能简介: 客户可以通过IUnknown中包含的QueryInterface函数查询某个组件是否支持某个特定的接口。 QueryInterface的行为必须是稳定的。 <1>、QueryInterface返回IUnknown接口时,总是返回同一IUnknown指针。 若对于某个给定的接口,QueryInterface曾经成功过,那么对于同一组件的后续QueryInterface将总是成功的。 总结:COM为QueryInterface制定上述规则的目的使为了使QueryInterface使用起来更为简单、更富有逻辑性、更一致及更具确定性。 QueryInterface定义了组件,因此是COM最为重要的部分。组件所支持的接口集就是QueryInterface能够返回接口指针的那些接口。

    99420编辑于 2022-09-15
  • 来自专栏全栈程序员必看

    QueryInterface 实现及使用的完整的例子

    下面我们将把前面所提到过和各代码段组合起来,以构成一个说明QueryInterface 实现及使用的完整例子。 总的来说可以将这些代码分成三部分。 第一部分是接口IX、 IY 和 IZ 的定义部分。 QueryInterface的实现同前一节中给出的实现是一样的。在类CA的末尾给出了CreateInstance 的定义。 CA: public IX, public IY { // IUnknown implementation virtual HRESULT _stdcall QueryInterface trace( “ client: Get interface IX “ ); IX * pIX = NULL; hr = pIUnKnown -> QueryInterface trace( “ client: Get interface IY “ ); IY * pIY = NULL; hr = pIUnKnown -> QueryInterface

    67630编辑于 2022-09-15
  • COM的QueryInterface与NonDelegatingQueryInterface的测试用例

    在组件对象模型(COM)编程中,QueryInterface和NonDelegatingQueryInterface是用于接口查询和管理的核心函数。 QueryInterface函数QueryInterface是一个标准的COM接口方法,它允许对象在被请求时提供其他接口的指针。这个方法是多继承和接口聚合的基础,使得对象能够支持多种接口。 NonDelegatingQueryInterface函数NonDelegatingQueryInterface是QueryInterface的一个变体,它通常用于非委托对象,即不将接口查询委托给外部未知对象的方法 ISomeInterface接口的COM对象class CMyComponent : public ISomeInterface {public: // IUnknown方法 STDMETHOD(QueryInterface 通过这些测试用例的执行,可以确保QueryInterface和NonDelegatingQueryInterface函数的正确实现和行为,从而保证COM对象的接口查询和管理机制的稳定性和可靠性。

    4.7K00编辑于 2024-10-13
  • 来自专栏全栈程序员必看

    mshtml一些用法

    ); IHTMLDocument2* pDocument; IHTMLElementCollection* pCollection; pDisp->QueryInterface ”); pCollection->tags(varID,&pDisp); IHTMLElementCollection* Collection; pDisp->QueryInterface ); //pCollection->tags(varID,&pDisp); //IHTMLElementCollection* Collection; //pDisp->QueryInterface //IHTMLInputElement* input; //hr = pDisp->QueryInterface CString strInfo; IHTMLTable * pTable; // 获得表格元素接口 hr = pDisp->QueryInterface

    49530编辑于 2022-07-25
  • 来自专栏jiajia_deng

    利用 NvAPI 设置数字振动数值

    1)需要的方法和结构 设置数字振动数值需要先通过 nvapi.dll 导出的 NvAPI_QueryInterface_t 方法获取 NvAPI_Initialize_t 方法来初始化 NvAPI。 方法的地址,然后通过 nvapi_QueryInterface 方法查询另外一些接口的地址。 = (NvAPI_QueryInterface_t)GetProcAddress(hModule, "nvapi_QueryInterface"); NvAPI_Initialize = (NvAPI_Initialize_t )(*NvAPI_QueryInterface)(_NvAPI_EnumNvidiaDisplayHandle); NvAPI_GetDVCInfoEx = (NvAPI_GetDVCInfoEx_t )(*NvAPI_QueryInterface)(_NvAPI_GetDVCInfoEx); NvAPI_SetDVCLevelEx = (NvAPI_SetDVCLevelEx_t)(*NvAPI_QueryInterface

    1.2K20发布于 2018-12-12
  • 来自专栏前端知否

    在Sequelize中使用迁移

    , Sequelize) => { return queryInterface.createTable('Users', { id: { allowNull , Sequelize) => { return queryInterface.dropTable('Users'); } }; 执行迁移: npx sequelize db: , Sequelize) => { return queryInterface.createTable('Users', { id: { allowNull: false , Sequelize) => { return queryInterface.bulkInsert('Users', [ { username: 'Kimoo', Example: return queryInterface.bulkDelete('Person', null, {}); */ return queryInterface.bulkDelete

    2.3K10发布于 2020-03-23
  • C/C++ 实现COM转换到接口

    interface IUnknown{ HRESULT QueryInterface( // 查询com对象的其他接口指针 [in] REFIID iid, // 接口ID [out] IAntiCheat 接口 class Inherit:public IAntiCheat{ public: // 声明 IUnknown 成员 virtual HRESULT __stdcall QueryInterface return 0; } // 实现 QueryInterface HRESULT __stdcall Inherit::QueryInterface(const IID& iid, void** ppv ,获取接口类指针 IAntiCheat* pIAntiCheat = NULL; HRESULT hr = pIUnknown->QueryInterface( IID_IAntiCheat , (void**)&pIAntiCheat ); // 判断 QueryInterface 是否执行成功 if (SUCCEEDED(hr)){ // 调用你的接口函数

    62020编辑于 2022-12-28
  • 来自专栏jiajia_deng

    利用 NvAPI 设置数字振动数值

    1)需要的方法和结构 设置数字振动数值需要先通过 nvapi.dll 导出的 NvAPI_QueryInterface_t 方法获取 NvAPI_Initialize_t 方法来初始化 NvAPI。 方法的地址,然后通过 nvapi_QueryInterface 方法查询另外一些接口的地址。 = (NvAPI_QueryInterface_t)GetProcAddress(hModule, "nvapi_QueryInterface"); NvAPI_Initialize = (NvAPI_Initialize_t )(*NvAPI_QueryInterface)(_NvAPI_EnumNvidiaDisplayHandle); NvAPI_GetDVCInfoEx = (NvAPI_GetDVCInfoEx_t )(*NvAPI_QueryInterface)(_NvAPI_GetDVCInfoEx); NvAPI_SetDVCLevelEx = (NvAPI_SetDVCLevelEx_t)(*NvAPI_QueryInterface

    2.3K30发布于 2018-12-12
  • 来自专栏码客

    Go调用WPS转换文档为PDF

    unknown, _ := oleutil.CreateObject("Word.Application") defer unknown.Release() word, _ := unknown.QueryInterface unknown, _ := oleutil.CreateObject("Excel.Application") defer unknown.Release() excel, _ := unknown.QueryInterface unknown, _ := oleutil.CreateObject("KWPS.Application") defer unknown.Release() word, _ := unknown.QueryInterface unknown, _ := oleutil.CreateObject("KWPP.Application") defer unknown.Release() ppt, _ := unknown.QueryInterface unknown, _ := oleutil.CreateObject("KET.Application") defer unknown.Release() excel, _ := unknown.QueryInterface

    2.3K10编辑于 2023-04-27
  • 来自专栏InCerry

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

    (IntPtr self, Guid* guid, IntPtr* ptr) { Console.WriteLine("QueryInterface"); (IntPtr self, Guid* guid, IntPtr* ptr) { Console.WriteLine("QueryInterface"); *ptr (为简洁起见,已省略) _instances.Add((IntPtr)chunk, this); } public int QueryInterface(Guid 在静态的QueryInterfaceNative方法中,我们从静态字典中检索该实例,并调用非静态的QueryInterface方法。 这是可行的,但每次调用方法时都要进行字典查找是很遗憾的。 (Guid* guid, IntPtr* ptr) { Console.WriteLine("QueryInterface"); *ptr = IntPtr.Zero

    37230编辑于 2023-08-31
  • 来自专栏流媒体技术

    将桌面捕获到虚拟摄像头

    ////// static CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr); STDMETHODIMP QueryInterface CSourceStream **) new CVCamStream*[1]; m_paStreams[0] = new CVCamStream(phr, this, L"Flex COM"); 在实现COM接口的QueryInterface 函数中,我们调用了CVCamStream类的QueryInterface HRESULT CVCam::QueryInterface(REFIID riid, void **ppv) { //Forward uuidof(IAMDroppedFrames) || riid == _uuidof(IKsPropertySet)) return m_paStreams[0]->QueryInterface (riid, ppv); else return CSource::QueryInterface(riid, ppv); } 定义媒体类型 HRESULT CVCamStream

    1.5K20编辑于 2022-07-28
  • 来自专栏InCerry

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

    Initialize"); // TODO: To be implemented return HResult.S_OK; } public HResult QueryInterface if (guid == ICorProfilerCallback2Guid) { Console.WriteLine("[Profiler] ICorProfilerCallback2 - QueryInterface 我们需要在其上调用 QueryInterface以检索到 ICorProfilerInfo的实例。 要将对象暴露给本机代码,我们已经看到如何创建一个虚假的 vtable。 _self = self; } private IntPtr* VTable => (IntPtr*)*(IntPtr*)_self; // TODO: 实现 QueryInterface 然后我们只需要调用它们,确保将对象的地址作为第一个参数传递,因为它们是实例方法: public HResult QueryInterface(in Guid guid, out IntPtr ptr)

    44830编辑于 2023-08-31
领券