2013-05-15 49 views
1

在我的代碼中有一個函數調用InvokeHelper。我在互聯網上發現的是,InvokeHelper用於通過使用dwDispID調用函數。哪個函數被InvokeHelper調用

這是電話。

InvokeHelper(0xd, DISPATCH_METHOD, VT_DISPATCH, (void*)&pDispatch, parms, Name); 

現在我想調試裏面。但我不知道哪個函數會被調用。 0xd是指向哪個函數?在項目中也有odl文件。這會調用該odl的某個呼叫嗎?什麼功能?

編輯:

我發現CPP文件的頂部這些行。

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++ 

// NOTE: Do not modify the contents of this file. If this class is regenerated by 
// Microsoft Visual C++, your modifications will be overwritten. 

所以它看起來像這個類是包裝。但是哪個類的包裝?

+0

InvokeHelper不是一個靜態函數。它只是在當前類實例上調用方法ID 13。 –

+0

問題是我不知道班級在哪裏。它是一些第三方自動生成的代碼。這個類不存在於idl文件中。我只想知道它是哪個類的包裝。 –

回答

2

首先,您需要找到您正在調用的接口的定義,以及哪些實現了IDispatch。如果它是您自己的界面,它將位於項目中的.idl或.odl文件中。

在接口定義中,每個方法都會有一個[DISPID]屬性和相應的編號。你需要找到一個ID爲0xD或13的那個。那是你的方法。

'這會調用該odl的某個呼叫嗎?'

是的,如果執行調用的對象是在ODL中定義的類的實例。很難說沒有看到您的項目,因爲從樣本中不清楚這是一個「外部」對象(即其他地方定義和實施)還是來自項目的對象。

但是,在這種情況下,我會說它是你的項目的外部類,正如你提到生成的包裝類。這是在將外部COM庫添加到項目時創建的 - 包裝程序方便地將COM調用包裝到C++類中。

您的InvokeHelper已經在某個方法中 - 該方法的名稱與最終將調用的IDispatch派生接口上的方法的名稱相同。因此,是否可以調試取決於您是否具有組件的代碼。

通常,生成的包裝器的名稱可以指向包裝的COM組件的名稱,但並非總是如此(它總是類似於COM類的名稱,但可以有多個類在同一個COM服務器中)。要找出COM類正是這一點,你可以用類似線檢查包裝頭文件的一部分:

static CLSID const clsid 
    = { 0x9e3c8066, 0x7f88, 0x11d1, { 0xbb, 0x57, 0x44, 0x45, 0x53, 0x54, 0x0, 0x1 } }; 

這是底層的COM類的CLSID,你可以看看它在註冊表中看到究竟什麼是該類的ProgId和它在哪個DLL/EXE託管。欲瞭解更多詳情,請參閱here

'Essential COM'的前4章提供了有關COM需要了解的信息的很好介紹,以解決與使用COM組件相關的90%問題。

+0

我在整個解決方案中進行了搜索,包含此行的方法不存在於任何地方。我想知道哪些是外部類。 odl文件中不存在此方法。 –

+0

您還沒有理解過去的兩段。具有該名稱的方法在您的項目中絕對不存在,因爲它是_external_組件的包裝器。例如,它可能是一些由OS提供的COM庫/服務器。有關詳細信息,請參閱更新的答案 –

+0

好的,我能找到這個班。在頭文件類中定義了一些東西。這是原來的班級名稱,我查看了更多細節,並且能夠找到所有功能。感謝您的幫助, –

1

0xd指向.idl/.odl文件中具有匹配id的函數。當一個COM對象支持IDispatch接口,每個功能得到像這樣的數字:

[id(1), helpstring("method Test")] HRESULT Test([in] long number);

在你的情況下,該功能有13個(0xd中十六進制)的ID。這是在運行時會得到「調用」的函數。
除非您有雙方的源代碼和.pdb文件,否則您不能進入(調試)該功能。

如果此文件是從MFC或託管代碼生成的,具有運行時可調用包裝器,則會創建一個代理類。它的名字將與原始.idl文件中的COM接口名稱非常接近。這應該給你一個線索來自包裝的來源。 有意義嗎?

+0

我在整個解決方案中進行了搜索,包含此行的方法在任何地方都不存在。我想知道哪些是外部類。 odl文件中不存在此方法。 –

+0

找到生成的代理類文件並查找id爲13(0xd hex)的函數。這會給你這個函數的名字。沒有組件的原始源代碼,你無法獲得更多的信息。 – edtheprogrammerguy