Visual C++:InvokeHelper()函数

Joh*_*ohn 2 c++ com visual-c++

我正在破译一个使用COM的巨大项目,我完全不熟悉它.这很令人困惑,我无法弄清楚一切如何相互作用.我所看到的只是InvokeHelper(...),我希望看到大量的代码.什么是InvokeHelper()?它有什么作用?感谢您的任何帮助.

Ant*_*n K 6

虽然这是迟到的答案,但我想在这里发布,因为我花了几天的时间来弄清楚它是如何工作的.它可能对其他人感兴趣.

下面是如何从InvokeHelper()调用获取实际代码的路径:

  1. 应该为一个类的对象调用InvokeHelper(),继承自指定了DISPID的CWnd,其中DISPID类似于0x00000261
  2. 该类应该在内部调用具有COM类GUID的方法CreateControl()
  3. 具有GUID的COM类应该是具有至少一个IDL接口的COM coclass
  4. IDL接口应实现具有属性[id(DISPID)]的方法.这与第1项中的DISPID相同
  5. 查找接口的实现并找到具有此id属性的方法
  6. 瞧!

当然,如果您没有带有CLSID的COM类的源代码,则无法查看该方法,但至少,您可以按如下方式查找其名称:

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)); 
Run Code Online (Sandbox Code Playgroud)

我希望它对某人有帮助.照顾自己.