Visual C ++:InvokeHelper()函数

时间:2011-05-10 03:12:46

标签: c++ visual-c++ com

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

1 个答案:

答案 0 :(得分:6)

即使这是迟到的回答,我也想在这里发布,因为我花了几天的时间来弄清楚它是如何工作的。它可能对其他人感兴趣。

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

  1. 应该为类的对象调用InvokeHelper(),从CWnd继承,并指定DISPID,其中DISPID类似于0x00000261
  2. 该类应该在内部调用具有COM类GUID的方法CreateControl()
  3. 具有GUID的COM类应该是具有至少一个IDL接口的COM coclass
  4. IDL接口应实现具有属性[id(DISPID)]的方法。这与第1项中的DISPID相同
  5. 查找接口的实现并找到具有此id属性的方法
  6. 瞧!
  7. 当然,如果您没有带有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)); 
    

    我希望它有助于某人。 小心。