我可以从COM Dispatch Interface获取用于挂接的函数指针吗? (不是双接口)

| 我可以问一下COM Distach接口中的挂钩方法吗? 最近,我正在开发一些实用程序,它是一种COM监视工具。 而且我正在尝试在运行时钩住Com对象的界面。 为此,我需要使用类型lib。 以下是我的代码概述。
// Load Type Lib.
LoadRegTypeLib( TypeLibCLSID , wMajorVersion , wMinorVersion , lcid  , &pTypeLib );

// Get Function Descriptor
pInterfaceTypeInfo->GetFuncDesc( iii , &pfuncdesc );

// Create Instance and Get Interface
CoCreateInstance( pClassAttr->guid , NULL, ClassContext,  pInterfaceAttr->guid , (void**)&pUnknownObject );

// Get VTable
dwOrgFunctionPointer = *(DWORD*)pUnknownObject;

// adjust offset
dwOrgFunctionPointer += pfuncdesc->oVft;

// Get Function Pointer
dwOrgFunctionPointer = *(DWORD*)dwOrgFunctionPointer ;

// Hook
MyHookMethod( dwOrgFunctionPointer );
这是成功的,直到我找到一些具有调度接口(不是双重接口)的Com对象。 如果某个Com对象只有Dispatch接口(不是Dual),则VTable中没有函数指针。 只有MFC的函数指针,例如GetTypeInfoCount,GetTypeInfo,GetIDsOfNames,Invoke。 此外,对于所有属于该接口的函数,pfuncdesc-> oVft始终为0。 我知道当我使用这类com对象时,应该使用\'Invoke \'方法。 但是问题是我试图钩住。我需要函数指针。 我如何从IDispatch获取那些函数指针? IDispatch-> vtable中只有MFC的函数指针。 任何建议将被认真考虑。 谢谢你     
已邀请:
要挂钩IDispatch,您可以挂钩/填充IDispatch的所有方法,可能主要集中在Invoke上。要记住的关键是IDispatch是一个非常特殊的接口。虽然COM规则确保IID_IDispatch的QI返回单个实现,但是从IDispatch派生的其他接口可以选择具有自己的Invoke等人的单独实现。这意味着强制转换为IDispatch会产生与QI-ing不同的结果。我发现这种行为令人困惑,但是一些经典的AX场景要求这样做。 话虽如此,我强烈建议您不要以这种方式进行挂钩,除非出于调试目的。不要在真实的应用程序代码中发布以这种方式工作的代码。结果将是非常不稳定的。 马丁     

要回复问题请先登录注册