c++builder 将Handle句柄转成对象

来源:互联网 发布:mysql 一小时之前 编辑:程序博客网 时间:2024/05/21 11:19
#pragma pack(1)struct TObjectInstance{  byte Code;           //{ 短跳转 $E8 }  int Offset;       //{ CalcJmpOffset(Instance, @Block^.Code); }  TObjectInstance * Next; //{ MainWndProc 地址 }  void * Self;         //{ 控件对象地址 }};typedef TObjectInstance * PObjectInstance ;TWinControl * GetInstanceFromhWnd(HWND hWnd){  PObjectInstance wc;  wc     = (PObjectInstance)GetWindowLong(hWnd, GWL_WNDPROC);  if (wc != NULL )    return (TWinControl *)wc->Self;  else    return NULL;}void __fastcall TForm1::Button7Click(TObject *Sender){   TWinControl * p = GetInstanceFromhWnd(Edit1->Handle);   TEdit * f = dynamic_cast<TEdit *>(p);   Button7->Caption = f->Text;}

窗口回调函数指针,相邻的第10个字节处,是消息对象指针,如果不想用#pragma pack(1)改变编译器属性的话,可以用如下方法:

struct obj{   byte a1;   byte a2;   byte a3;   byte a4;   byte a5;   byte a6;   byte a7;   byte a8;   byte a9;   byte a10;   byte a11;   byte a12;   byte a13;};TWinControl * GetInstanceFromhWnd(HWND hWnd){  obj * wc1     = (obj *)GetWindowLong(hWnd, GWL_WNDPROC);  if (wc1 != NULL )  {    int c1 =  wc1->a13;    int c2 =  wc1->a12;    int c3 =  wc1->a11;    int c4 =  wc1->a10;    int p1 = int(c1 << 24) + int(c2 << 16) +int(c3 << 8) + c4;    return (TWinControl *)p1;  }  else    return NULL;}void __fastcall TForm1::Button7Click(TObject *Sender){   TWinControl * p = GetInstanceFromhWnd(Edit1->Handle);   TEdit * f = dynamic_cast<TEdit *>(p);   Button7->Caption = f->Text;}
效果同上,用了不同的结构体获取对象偏移指针,在C++builder中,用下面这句也可以:

TForm * f = (TForm * )FindControl(Handle);


0 0
原创粉丝点击