c++ - InvokeHelper 正在调用哪个函数

标签 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.

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

最佳答案

首先,您需要找到正在调用的接口(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/

相关文章:

c# - C++ 程序在调用 C# 接口(interface)时接收 HOST_E_CLRNOTAVAILABLE

c++ - 使用自定义类集时出错

c++ - 计算 00 到 09 之间的范围(不是 0 到 9 之间的范围)

c++ - CoRegisterClassObject 破坏线程安全

c++ - CComPtr 和引用计数

c# - 方法被调用后执行两次

c++ - VS 2008 C++ : How can I copy other files to the output folder?

c++ - 如何将字符串 "YYYY/MM/DD"格式日期转换为 VARIANT 类型日期,反之亦然

c# - Unity c# 触发另一个 GameObject 的方法。更好的方法?

java - 使用反射调用字段上的方法