我可以问一下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 );
这是成功的,直到我找到一些具有Dispatch Interface(不是双重)的Com Object。
如果某个Com Object只有Dispatch Interface(不是双重),则VTable中没有函数指针。
只有MFC的函数指针,如GetTypeInfoCount,GetTypeInfo,GetIDsOfNames,Invoke。
此外,对于属于该接口的所有函数,pfuncdesc-> oVft始终为0。
我知道当我使用这些com对象时,我会使用'Invoke'方法。
但问题是我试图挂钩。我需要函数指针。
如何从IDispatch获取这些函数指针?
在IDispatch-> vtable中只有MFC的函数指针。
任何建议将不胜感激。
骗过你。
答案 0 :(得分:0)
对于Hook IDispatch,您可以挂钩/填充IDispatch的所有方法,可能主要集中在Invoke上。要记住的一个关键事项是IDispatch是一个非常特殊的界面。虽然COM规则确保IID_IDispatch的QI返回单个实现,但是从IDispatch派生的其他接口可以选择拥有自己独立的Invoke等实现。这意味着对IDispatch进行投射会产生与QI-ing不同的结果。我发现这种行为令人困惑,但一些经典的AX场景需要它。
话虽如此,我强烈建议不要以这种方式挂钩,除非是为了调试目的。不要在真实的应用程序代码中提供以这种方式工作的代码。结果会很不稳定。
马丁