You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:25:54