在我的代码中有一个对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.
所以看起来这个类是包装器。但是哪个类的包装?
答案 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接口名称非常接近。那应该会给你一个包装来自哪里的线索。 有意义吗?