【发布时间】: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)在那个地址中会区分这些函数。