【问题标题】:How to get function name against function address by reading co-classs'es vtable?如何通过读取 co-classs 的 vtable 来获取函数名称和函数地址?
【发布时间】:2011-12-24 21:19:45
【问题描述】:

我需要通过从 COM 公开接口方法的 vtable 中读取其地址来调用 co-class 函数。我需要一些通用的方法来读取地址。

现在我需要调用该函数,该函数将具有我从 TLB 收集的特定地址(未知)参数(参数)以及名称。该地址如何与我要调用的函数名称相对应。

为此,我需要遍历保存函数地址的 vtable,最后需要将函数地址与该函数的 NAME 对应。这是我不知道的。如何? vtable 中可能会出现多个同名函数(重载情况)。在这种情况下,我们需要根据地址来区分函数名称。如何应对? 问候 乌斯曼


尊敬的先生。!!

我正在设计一个单元测试框架,我需要提取某些 COM Exe 或 COM DLL 的所有函数签名以显示在网格或任何用户界面中,以便稍后通过从该列表中选择某些函数签名,他/她可以在向该函数提供参数(数据作为参数)后执行该函数。所有这些都将在运行时动态完成,在运行时函数将被调用任何用户想要的。

这可以通过多种方式实现。

通过提供 TLB(类型库),我们可以提取每个函数签名,并将每个签名显示给 Grid 控件或 Tree 控件。第二步是通过提供数据在运行时调用这些函数。调用需要函数(或名称)的数据和地址。我会有一些 GUI 面板或控件,它们将从用户那里获取数据,然后这些数据将成为参数。

现在真正的问题来了,我之前发布过。调用由 co-class 实现的 COM 组件公开的接口的函数/方法。这需要跟踪组件公开的接口的 vtable,找到该函数的地址,然后需要知道我要调用的地址真的是函数吗?因此,这需要将该地址转换为函数名称,然后进行比较,一些字符串比较将决定它是否真的是用户从树控件中单击的函数名称,显示签名。

建议或推荐?

【问题讨论】:

  • 嗯,也许我不应该删除我的帖子。看起来你真的研究过这个主题。只是评论,我不指望投票,vtable槽按接口和方法声明顺序分配,类型库具有相同的顺序。 IUnknown 的 3 个方法永远是第一位的。
  • 但是类型库不会给我们函数的地址。我们将遍历 vtable 来查找函数地址,并使用类型库来获取这些方法的名称。但真正的问题是我们如何将这些功能地址翻译成他们的名字?接口中可能有几个同名的方法(overloadig case)在那个地址中会区分这些函数。

标签: com runtime vtable


【解决方案1】:

为每个函数调用ITypeInfo::GetFuncDesc,返回的 FUNCDESC 结构包含 oVft 成员中的 vtable 索引。将接口 vtable 转换为 void** 并将其用作索引。

当然,我不知道你为什么需要这样做:)

【讨论】:

  • 我想知道我们不能使用“lpVtable”成员。它是隐藏的。每当我们引用该成员时,例如说 pTypeInfo->lpVtble 。它会给出错误并说它不是该成员。
  • 我想你不明白 COM 对象是如何工作的。要对对象进行单元测试,您需要一个实例。所以你做IInterfaceToTest* pTest; CoCreateInstance(..., IID_IInterfaceToTest, &pTest);(假设你用C/C++编写)。要获得 vtable,您需要执行 void** pVTable = *((void***)pTest); 并最终执行 void* pFunction = pVTable[funcDesc.oVft]; 参见简单。如果你用另一种语言做它而无法访问二进制表示(比如 VB),那么生活很艰难。如果您使用的是 .NET,您可以将类型库转换为本机接口并调用方法。
  • 好的!我通过其他方式获得了 vtable 地址。 typedef void (FN)(void); int dwPtr= (int*)pIUknown; pFn=(FN)*((int*)*(&dwPtr[Count])+funcDesc.oVft);顺便说一句,您如何注意到使用 (void**) 对 pTest 进行类型转换会得到 vTable 数组..?
  • 真的不应该使用 int* 来获取指针,因为如果你移动到 64 位它会变坏:)
  • 尊敬的 oVft 先生并没有为您提供正确的索引。如果我的方法被放置在第 7 个索引处(我通过硬编码检查)oVft 将其显示为 28。就像它在 0 处显示 QuesryInterface,在第 4 个索引处显示 AddRef,在 8 处释放等等.....
猜你喜欢
  • 1970-01-01
  • 2015-02-17
  • 2014-05-19
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
相关资源
最近更新 更多