2011-05-24 39 views
0

我可以問一些關於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。

+0

這是不可能的,IDispatch使用後期綁定。除了IDispatch的方法之外,沒有什麼可以掛鉤的了。服務器實現可以像dispid上的switch語句一樣簡單。 – 2011-05-24 04:27:46

+0

hm ...有什麼可能嗎?當我使用調試器時,我在'Invoke'方法中看到了一些代碼,如COleDispatchImpl類,GetDispEntry方法,CCmdTarget類。我猜可能有一些函數表用於「Invoke」方法。那有沒有什麼?無論如何謝謝你的評論。 – Darpangs 2011-05-24 04:42:18

回答

0

鉤住IDispatch,您可以鉤住/填充IDispatch的所有方法,可能主要集中在Invoke上。要記住的一個關鍵是IDispatch是它是一個非常特殊的界面。雖然COM規則確保IID_IDispatch的QI返回單個實現,但從IDispatch派生的其他接口可以選擇具有其各自的Invoke等實現。這意味着投射到IDispatch可以從QI-ing產生不同的結果。我發現這種行爲令人困惑,但一些經典的AX方案需要它。儘管如此,我強烈建議不要以這種方式掛鉤,除非是爲了調試目的。請勿在真實應用程序代碼中發佈以此方式工作的代碼。它會變得非常不穩定。

Martyn

+0

謝謝你的建議。實際上,我正在考慮如你所提到的那樣鉤住「Invoke」方法。我會記住你的建議。 – Darpangs 2011-05-24 07:08:48