Несмотря на поздний ответ, я хотел бы опубликовать его здесь, так как потратил пару дней, чтобы выяснить, как он работает. Это может быть интересно для кого-то еще.
Ниже приведен путь получения реального кода из вызова InvokeHelper ():
- InvokeHelper () должен вызываться для объекта класса, унаследованного от CWnd с указанным DISPID, где DISPID является чем-то вроде 0x00000261
- Класс должен иметь внутри вызов метода CreateControl () с GUID COM-класса
- COM-класс с GUID должен быть COM-классом как минимум с одним интерфейсом IDL
- Интерфейс IDL должен реализовывать метод с атрибутом [id (DISPID)]. Это тот же DISPID, что и в пункте 1
- Найдите реализацию интерфейса и найдите метод с этим атрибутом id
- Вуаля!
Конечно, если у вас нет исходного кода класса COM с CLSID, вы не можете заглянуть внутрь метода, но, по крайней мере, вы можете найти его имя следующим образом:
DISPID dispidCommand = 0x1; /// This is the dispid, you're looking for
COleDispatchDriver driver;
BOOL bRes = driver.CreateDispatch(GetClsid());
ASSERT(bRes);
HRESULT hr;
CComPtr<ITypeInfo> pti;
hr = driver.m_lpDispatch->GetTypeInfo(0, GetUserDefaultLCID(), &pti);
ASSERT(SUCCEEDED(hr));
UINT nCount = 0;
CComBSTR bstrName; // Name of the method, which is called via DISPID
hr = pti->GetNames(dispidCommand, &bstrName, 1, &nCount);
ASSERT(SUCCEEDED(hr));
Надеюсь, это кому-нибудь поможет.
Береги себя.