的情況是這樣的: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。
我明白了。它必須是一個沒有vtable的接口。但是,那麼DispInvoke的用法是什麼呢? Windows中幾乎所有的通知接口都以相同的方式構建。 – Michael
@Michael我認爲DispInvoke是爲了實現普通的雙接口(實現者通常也是接口的創建者)而不是事件(回調,通知)接口的幫助,其中實現者特別不是接口的創建者。請注意,通常在使界面變爲雙重而不是調度界面方面沒有任何損失,但是對於使界面變爲雙重界面的事件界面而言,意味着不是腳本語言(無法創建vtable)將無法接收事件。 – ymett