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

最佳答案

即使这是一个迟到的答案,我还是想把它贴在这里,因为我花了几天的时间来弄清楚它是如何工作的。对其他人来说可能很有趣。

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

  • InvokeHelper() 应该为类的对象调用,继承自 CWnd 并指定了 DISPID,其中 DISPID 类似于 0x00000261
  • 该类应该在调用 CreateControl() 方法时使用 COM 类的 GUID
  • 带有 GUID 的 COM 类应该是带有至少一个 IDL 接口(interface)的 COM coclass
  • IDL 接口(interface)应该实现一个带有 [id(DISPID)] 属性的方法。这与第 1 项
  • 中的 DISPID 相同
  • 寻找接口(interface)的实现,找到这个id属性的方法
  • 瞧!

  • 当然,如果您没有带有 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));
    

    我希望它可以帮助某人。
    小心。

    关于c++ - Visual C++ : InvokeHelper() function,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5944755/

    10-11 01:12