我可以問一些關於COM Distach接口中鉤子方法的問題嗎?我可以從COM Dispatch接口獲取鉤子函數指針嗎? (不是雙接口)
最近,我正在做一些實用工具,它是一種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 Object只有Dispatch Interface(不是雙重),那麼在VTable中就沒有函數指針了。
只有MFC的函數指針像GetTypeInfoCount,GetTypeInfo,GetIDsOfNames,Invoke。
此外,對於屬於該接口的所有功能,pfuncdesc-> oVft始終爲0。
我知道當我使用這些com對象時,我應該使用'Invoke'方法。
但問題是,我試圖掛鉤。我需要函數指針。
如何從IDispatch獲取這些函數指針?
在IDispatch-> vtable中只有MFC的函數指針。
任何意見將不勝感激。
Thnak you。
這是不可能的,IDispatch使用後期綁定。除了IDispatch的方法之外,沒有什麼可以掛鉤的了。服務器實現可以像dispid上的switch語句一樣簡單。 – 2011-05-24 04:27:46
hm ...有什麼可能嗎?當我使用調試器時,我在'Invoke'方法中看到了一些代碼,如COleDispatchImpl類,GetDispEntry方法,CCmdTarget類。我猜可能有一些函數表用於「Invoke」方法。那有沒有什麼?無論如何謝謝你的評論。 – Darpangs 2011-05-24 04:42:18