来自《天方夜谭VCL》,如何生成一个未知类型的类。
TComponent* CreateComponent(TComponent* AOwner, TClass cls)
{
TComponent* r;
const void* const fn = *(void**)((char*)cls + vmtNewInstance),
* const fc = *((void**)cls + 11);
//fn是NewInstance的地址,
//fc则是构造函数的地址,从第一个往后数11个,即第12个
//下面为了偷懒,用几句汇编
asm{
mov eax, cls
call fn //调用NewInstance,执行图1流程前3步
mov r, eax
mov edx, AOwner
call fc //调用构造函数
}
return r;
}
class TTestButton: public TButton
{
public:
__fastcall TTestButton(TComponent* Owner): TButton(Owner)
{
ShowMessage("Hello!");
}
__fastcall ~TTestButton()
{
ShowMessage("Goodbye!");
}
};
//调用如下
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TComponent* p = CreateComponent(0, __classid(TTestButton));//此函数生成一个类型特性未知的类
TButton * b = dynamic_cast<TButton *>(p);//转成已知某类型
b->Parent = this;
b->Visible = true;//显示
ShowMessage( AnsiString(p->ClassName()).c_str());
delete p;
}