2011-08-25 142 views
0

的情況是這樣的:C++ DispInvoke未能找到成員

  • 我有一個COM對象發問。將其命名爲ICom。
  • COM對象要求我實現一個IDispatch,即IComEvents的後代,它通知我事件。
  • 我實現了一個IDispatch並將其連接到COM接口。

到目前爲止好。當事件發生時,我的IComEvents下降的Invoke()被調用。

現在,我必須手動解析Invoke()參數。例如,如果通知功能是HRESULT OnMouseHit(INT x)中,我必須檢測從DISPID該功能,然後手動調用它,例如

if (dispIdMember == 0xfa) 
{ 
OnMouseHit(pDispParams->rgvarg[0].pIntVal); 
} 

我必須做到這一點對所有的功能我想要實施。但是我看到DispInvoke()函數,這大概會自動爲我做到這一點,並呼籲DISPID適當的重載方法,用正確的參數:

DispInvoke(this,m_ptinfo,dispIdMember,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr); 

如何產生m_ptinfo?通過使用COM對象的libid調用LoadRegTypeLib,然後使用IComEvents的IID調用ITypeLib :: GetTypeInfoOfGuid()。但是,DispInvoke()始終返回「未找到成員」。

會出現什麼問題?我期望DispInvoke解析類型信息,從DispID中找到成員函數名稱,然後使用「this」指針從vtbl獲取函數地址。

我在做什麼錯?

非常感謝。 Michael。

回答

0

IComEvents雙接口或調度接口?如果它是純粹的調度接口,它不具有虛擬表。 DispInvoke需要接口有一個vtable(即它是一個雙接口)。

+0

我明白了。它必須是一個沒有vtable的接口。但是,那麼DispInvoke的用法是什麼呢? Windows中幾乎所有的通知接口都以相同的方式構建。 – Michael

+0

@Michael我認爲DispInvoke是爲了實現普通的雙接口(實現者通常也是接口的創建者)而不是事件(回調,通知)接口的幫助,其中實現者特別不是接口的創建者。請注意,通常在使界面變爲雙重而不是調度界面方面沒有任何損失,但是對於使界面變爲雙重界面的事件界面而言,意味着不是腳本語言(無法創建vtable)將無法接收事件。 – ymett