InvokeHelper正在调用哪个函数

时间:2013-05-15 12:36:32

标签: c++ com invoke

在我的代码中有一个对InvokeHelper的函数调用。我在互联网上发现的是,InvokeHelper用于通过使用dwDispID来调用函数。

这是电话。

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

现在我想在里面调试。但我不知道将调用哪个函数。 0xd指向哪个函数?项目中也有odl文件。这会调用那个odl的一些电话吗?什么功能?

修改

我发现这些行位于cpp文件的顶部。

// 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.

所以看起来这个类是包装器。但是哪个类的包装?

2 个答案:

答案 0 :(得分:3)

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

在接口定义中,每个方法都有一个[DISPID]属性和相应的编号。您需要找到ID为0xD或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。有关详细信息,请参阅here

'Essential COM'的前4章提供了有关COM需要了解的内容的精彩介绍,以解决与使用COM组件相关的90%的问题。

答案 1 :(得分:1)

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

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

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

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