如何确定 VMT 指针的计数
How to determine count of VMT pointers
使用 Visual C++ 编译器,每个 class 对象都有 VMT
(对象中的第一个指针),它是指向 class 中每个方法的指针数组的指针。使用这样的代码:
TestObject * object = new TestObject();
void** VMT = (void**)object;
int TestCount = 100;
for( int i = 0; i < TestCount; i ++ )
{
printf("%d function: %p\r\n", (i+1), VMT[i] );
}
此代码枚举了 class 中的前 100 个函数,但考虑到我没有 class 定义,我如何确定这些指针 class 有多少?如何动态找出?
谢谢!
只是不要这样做。
首先,没有虚拟成员的 class 没有 V-table,因此您尝试获取它最多会给出一个无效指针,最坏的情况是会崩溃。
其次,即使你得到它,你也只会在其中找到指向虚成员函数的指针,普通函数不会放在V-table.
中
第三,虽然我确实注意到您使用的是 MSVC,因此可移植性不是问题,但这是可怕的 non-portable。我记得回到一个非常有趣的面向对象系统,我在我编写的一款游戏中使用了该系统,该系统在 Sega Genesis 上发布。这一切都是在 68K 汇编程序中完成的,大约在 1995 年,包括 V-table。由于有趣的内存限制,所有 V-table 都位于距离其 class 实例数英里之外的第一个 64K 内存页的特殊区域中。我们使用了一些粗糙的链接器技巧来连接所有内容并使其正常工作。
我的观点是,您用于获取 VMT 的代码行可能根本不会指向 V-table。它的工作方式依赖于实现,编译器编写者可以自由地按照他们想要的方式进行,只要最终产品根据标准正确工作。
最后一个问题?为什么?您要解决什么问题需要像这样在大多数程序员远离的地方进行挖掘。
使用 Visual C++ 编译器,每个 class 对象都有 VMT
(对象中的第一个指针),它是指向 class 中每个方法的指针数组的指针。使用这样的代码:
TestObject * object = new TestObject();
void** VMT = (void**)object;
int TestCount = 100;
for( int i = 0; i < TestCount; i ++ )
{
printf("%d function: %p\r\n", (i+1), VMT[i] );
}
此代码枚举了 class 中的前 100 个函数,但考虑到我没有 class 定义,我如何确定这些指针 class 有多少?如何动态找出?
谢谢!
只是不要这样做。
首先,没有虚拟成员的 class 没有 V-table,因此您尝试获取它最多会给出一个无效指针,最坏的情况是会崩溃。
其次,即使你得到它,你也只会在其中找到指向虚成员函数的指针,普通函数不会放在V-table.
中第三,虽然我确实注意到您使用的是 MSVC,因此可移植性不是问题,但这是可怕的 non-portable。我记得回到一个非常有趣的面向对象系统,我在我编写的一款游戏中使用了该系统,该系统在 Sega Genesis 上发布。这一切都是在 68K 汇编程序中完成的,大约在 1995 年,包括 V-table。由于有趣的内存限制,所有 V-table 都位于距离其 class 实例数英里之外的第一个 64K 内存页的特殊区域中。我们使用了一些粗糙的链接器技巧来连接所有内容并使其正常工作。
我的观点是,您用于获取 VMT 的代码行可能根本不会指向 V-table。它的工作方式依赖于实现,编译器编写者可以自由地按照他们想要的方式进行,只要最终产品根据标准正确工作。
最后一个问题?为什么?您要解决什么问题需要像这样在大多数程序员远离的地方进行挖掘。