2

In my code there is a function call to InvokeHelper. What I found on internet is that InvokeHelper is used to call a function by using dwDispID.

This is the call.

InvokeHelper(0xd, DISPATCH_METHOD, VT_DISPATCH, (void*)&pDispatch, parms, Name);

Now I want to debug inside. But I don't know which function will be called. 0xd is pointing to which function? There is odl file in project as well. Will this invoke some call from that odl? What function?

EDIT:

I found these lines on the top of cpp file.

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file.  If this class is regenerated by
//  Microsoft Visual C++, your modifications will be overwritten.

So it looks like this class is wrapper. But wrapper of which class?

4

2 回答 2

3

首先,您需要找到您正在调用并实现的接口的定义IDispatch。如果它是您自己的接口,它将位于您项目中的 .idl 或 .odl 文件中。

在接口定义中,每个方法都有一个[DISPID]带有相应编号的属性。您需要找到 id0xD或 13 的那个。这是您的方法。

“这会调用来自那个 odl 的调用吗?”

是的,如果您执行调用的对象是 ODL 中定义的类的实例。如果没有看到您的项目,很难说出这一点,因为从您的示例中不清楚这是一个“外部”对象(即在其他地方定义和实现)还是来自您的项目的对象。

但是,在这种情况下,我会说它是项目外部的类,正如您提到的生成的包装类。这是在您将外部 COM 库添加到项目时创建的 - 包装器方便地将 COM 调用包装到 C++ 类中。

InvokeHelper已经在某个方法中 - 该方法的名称与 IDispatch 派生接口上的方法名称相同,该接口最终将被调用。所以能不能调试就看你有没有组件的代码了。

通常,生成的包装器的名称可以指向被包装的 COM 组件的名称,但并非总是如此(它总是与 COM 类的名称相似,但同一个 COM 中可以有多个类服务器)。要找出这到底是哪个 COM 类,您可以检查包装头文件的部分,如下所示:

static CLSID const clsid 
  = { 0x9e3c8066, 0x7f88, 0x11d1, { 0xbb, 0x57, 0x44, 0x45, 0x53, 0x54, 0x0, 0x1 } };

这是底层 COM 类的 CLSID,您可以在注册表中查找它以确切了解该类的 ProgId 是什么以及它托管在哪个 dll/exe 中。有关更多详细信息,请参见此处

“基本 COM”的前 4 章很好地介绍了您需要了解的有关 COM 的知识,以解决与使用 COM 组件相关的 90% 的问题。

于 2013-05-15T12:44:54.193 回答
2

0xd 指向在 .idl/.odl 文件中具有匹配 id 的函数。当 COM 对象支持 IDispatch 时,每个函数都会得到一个数字,如下所示:

[id(1), helpstring("method Test")] HRESULT Test([in] long number);

在您的情况下,该函数的 id 为 13(0xd hex)。那是在运行时将被“调用”的函数。
除非您拥有双方的源代码和 .pdb 文件,否则您无法进入(调试)该功能。

如果此文件是从 MFC 或具有运行时可调用包装器的托管代码生成的,则会创建一个代理类。它的名称将与原始 .idl 文件中的 COM 接口名称非常接近。这应该会给你一个包装器来自哪里的线索。说得通?

于 2013-05-15T12:47:55.903 回答