Visual C ++: функция InvokeHelper () - PullRequest
2 голосов
/ 10 мая 2011

Я расшифровываю огромный проект, использующий COM, для которого я совершенно новичок.Это довольно запутанно, и я не могу понять, как все взаимодействует.Все, что я вижу, это InvokeHelper (...), где я ожидаю увидеть большое количество кода.Что такое InvokeHelper ()?Что оно делает?Спасибо за любую помощь.

1 Ответ

6 голосов
/ 16 мая 2012

Несмотря на поздний ответ, я хотел бы опубликовать его здесь, так как потратил пару дней, чтобы выяснить, как он работает. Это может быть интересно для кого-то еще.

Ниже приведен путь получения реального кода из вызова InvokeHelper ():

  1. InvokeHelper () должен вызываться для объекта класса, унаследованного от CWnd с указанным DISPID, где DISPID является чем-то вроде 0x00000261
  2. Класс должен иметь внутри вызов метода CreateControl () с GUID COM-класса
  3. COM-класс с GUID должен быть COM-классом как минимум с одним интерфейсом IDL
  4. Интерфейс IDL должен реализовывать метод с атрибутом [id (DISPID)]. Это тот же DISPID, что и в пункте 1
  5. Найдите реализацию интерфейса и найдите метод с этим атрибутом id
  6. Вуаля!

Конечно, если у вас нет исходного кода класса 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)); 

Надеюсь, это кому-нибудь поможет. Береги себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...