如何使用*printf类函数输出System::Classes::TWndMethod变量的值?
输出TWndMethod变量地址及验证一致性的方法
一、解决%p格式输出TWndMethod的问题
System::Classes::TWndMethod属于闭包类型(__closure),它包含成员函数入口地址(Code)和对象实例指针(Data)两部分信息,直接强制转换为void*会触发编译器错误。正确做法是借助TMethod结构体拆分闭包内容后分别输出:
#include <System.Classes.hpp> #include <stdio.h> // 假设已获取TWndMethod类型变量 TWndMethod targetWndMethod = ...; // 将TWndMethod转换为TMethod结构体 TMethod methodInfo = *reinterpret_cast<TMethod*>(&targetWndMethod); // 输出成员函数地址与对象实例地址 printf("成员函数地址: %p\n", methodInfo.Code); printf("对象实例地址: %p\n", methodInfo.Data);
如果仅需输出TWndMethod变量自身的内存地址,直接取变量地址转换为void*即可:
printf("TWndMethod变量地址: %p\n", static_cast<void*>(&targetWndMethod));
二、验证三个TEdit原WndProc的一致性
对于同类型的TEdit控件实例,它们的原始WndProc成员函数入口(Code)完全相同,但每个控件的Data字段是各自的实例指针(即对象的this指针),因此直接比较TWndMethod变量会返回false。
若要验证函数逻辑是否一致,只需对比TMethod的Code字段:
// 保存三个TEdit的原始WndProc TWndMethod oldWndProc1 = Edit1->WndProc; TWndMethod oldWndProc2 = Edit2->WndProc; TWndMethod oldWndProc3 = Edit3->WndProc; // 转换为TMethod结构体 TMethod m1 = *reinterpret_cast<TMethod*>(&oldWndProc1); TMethod m2 = *reinterpret_cast<TMethod*>(&oldWndProc2); TMethod m3 = *reinterpret_cast<TMethod*>(&oldWndProc3); // 验证成员函数入口是否一致 if (m1.Code == m2.Code && m2.Code == m3.Code) { printf("三个TEdit的原始WndProc函数逻辑一致\n"); } else { printf("存在不同的原始WndProc函数逻辑\n"); }
实际上,同属TEdit类的实例,原始WndProc必然指向同一个成员函数,可放心基于此前提进行后续重写操作。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

