我正在破译一个使用 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++ - 视觉 C++ : InvokeHelper() function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944755/