InvokeHelper 正在调用哪个函数

fhn*_*eer 4 c++ com invoke

在我的代码中有一个对 InvokeHelper 的函数调用。我在网上找到的是InvokeHelper是通过dwDispID来调用函数的。

这就是电话。

InvokeHelper(0xd, DISPATCH_METHOD, VT_DISPATCH, (void*)&pDispatch, parms, Name);
Run Code Online (Sandbox Code Playgroud)

现在我想在里面调试。但我不知道会调用哪个函数。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.
Run Code Online (Sandbox Code Playgroud)

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

Zde*_*vic 5

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

在接口定义中,每个方法都会有一个[DISPID]具有相应编号的属性。你需要找到 id 或 13 的那个。0xD这就是你的方法。

“这会调用来自该 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 } };
Run Code Online (Sandbox Code Playgroud)

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

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