如何解决我可以从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场景要求这样做。
话虽如此,我强烈建议您不要以这种方式进行挂钩,除非出于调试目的。不要在真实的应用程序代码中发布以这种方式工作的代码。结果将是非常不稳定的。
马丁
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。