c++ - 视觉 C++ : InvokeHelper() function

标签 c++ visual-c++ com

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

最佳答案

虽然这是一个迟到的答案,但我还是想把它贴在这里,因为我花了几天时间弄清楚它是如何工作的。其他人可能会感兴趣。

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

  1. 应为类的对象调用 InvokeHelper(),该类继承自 CWnd 并指定了 DISPID,其中 DISPID 类似于 0x00000261
  2. 该类应该在调用 CreateControl() 方法时使用 COM 类的 GUID
  3. 具有 GUID 的 COM 类应该是具有至少一个 IDL 接口(interface)的 COM coclass
  4. IDL 接口(interface)应该实现一个带有属性 [id(DISPID)] 的方法。这与项目 1 中的 DISPID 相同
  5. 寻找接口(interface)的实现并找到具有此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)); 

希望对大家有所帮助。 保重。

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

相关文章:

c++ - Allegro draw_sprite()

c# - 传递 COM 方法默认参数

c++ - 在宏参数中使用#line 指令是否合法?

c++ - Visual Studio 2010 链接器查找多重定义的符号(在不应该的地方)

使用 Visual Studio 2012 编译 C 应用程序

windows - RegSvr32.exe的/n和/i参数有什么区别?

c# - .NET COM 回调

c++ - 如果所包含的对象也继承,如何定义相互继承的容器? (以QObject为基础)

c++ - 我的电脑不接受 s.length,但其他编译器接受

c++ - 构造函数中引发的异常的处理程序是什么?