Visual C++: InvokeHelper() function

Visual C++: InvokeHelper() function

本文关键字:function InvokeHelper C++ Visual      更新时间:2023-10-16

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

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

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

  1. InvokeHelper() 应该为类的对象调用,该类从指定了 DISPID 的 CWnd 继承,其中 DISPID 类似于 0x00000261
  2. 该类应该在调用方法 CreateControl() 中具有 COM 类的 GUID
  3. 具有 GUID 的 COM 类应该是具有至少一个 IDL 接口的 COM 类
  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)); 

我希望它对某人有所帮助。当心。