在我的代码中有一个对 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.
所以看起来这个类是包装器。但是哪个类的包装器?
最佳答案
首先,您需要找到正在调用的接口(interface)的定义,该接口(interface)实现了 IDispatch
。如果它是您自己的界面,它将位于您项目中的 .idl 或 .odl 文件中。
在接口(interface)定义中,每个方法都会有一个[DISPID]
属性和相应的编号。您需要找到 ID 为 0xD
或 13 的那个。这就是您的方法。
“这会调用来自那个 odl 的一些调用吗?”
是的,如果您对其执行调用的对象是您的 ODL 中定义的类的实例。在没有看到您的项目的情况下很难说清楚,因为从您的示例中不清楚这是一个“外部”对象(即在其他地方定义和实现)还是来自您的项目。
但是,在这种情况下,我会说它是项目外部的类,正如您提到的生成的包装器类。这是在您将外部 COM 库添加到项目时创建的 - 包装器方便地将 COM 调用包装到 C++ 类中。
您的 InvokeHelper
已经在某个方法中 - 该方法的名称与最终将被调用的 IDispatch 派生接口(interface)上的方法名称相同。所以能不能调试,就看你有没有这个组件的代码。
通常,生成的包装器的名称可以指向被包装的 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 .
前4章'Essential COM'很好地介绍了您需要了解的有关 COM 的知识,以解决 90% 与使用 COM 组件相关的问题。
关于c++ - InvokeHelper 正在调用哪个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16565172/