DLL中使用Form问题
在做大型项目的时候,通过一个主程序(EXE)带n个DLL的模式,是一种通用的做法,这样做的优点有:
1、便于项目的模块化,可以把逻辑上相近的模块封装到一起;
2、便于多人同时开发,由于每一个DLL的功能相对独立,可以同时并行开发;
3、便于发布后的维护和升级,在维护时可以单个单个DLL的修改和发布,不会影响其它模块。
当然还有其它好处,我目前就想到这些,大家补充(^_^偷懒!)
既然有这么多好处,我在开发一个项目时,就决定使用该模式,我的开发工具为C++BUILDER,
结果刚一开始就遇到n多问题(我在网上狂找了一阵,结果发现众说纷纭,莫衷一是,不过也给了我很多的启发)。
我开始的做法是在EXE中设置一个MDIForm,然后想在DLL中放置多个MDIChildForm,大概代码如下:
Host:
FormStyle 设置为fsMDIForm
MyShowForm(Application->Handle,asCaption)
DLL:
FormStyle设置为fsMDIChild
THandle* DllHandle;
MyShowForm(THandle* Handle,AnsiString asCaption)
{
DllHandle=Application->Handle; //保存DLL的Handle
Application->Handle=Handle; //使用EXE的Handle
if( asCaption == “Form1” )
{
Form1=new TForm1(Application->Handle);
}
else
…
}
结果发现这种用法问题多多,如当DLL获得焦点时,Tab键和Enter键都不起作用了,在退出时也有问题。
我想这都是因为EXE和DLL不在同一地址空间的缘故,EXE和DLL分别维护各自得内存空间。
加上我想把DLL中的Form放到EXE的Form中的某个控件中去,于是采用了如下的方式:
Host:
FormStyle设为fsNormal(设为fsMDIForm也可)
创建调用 MyShowForm(Control,asCaption);
关闭调用 MyDeleteForm(asCaption);
DLL:
FormStyle必须设置为fsNormal
MyShowForm(TWinControl* wcParent,AnsiStirng asCaption)
{
if( asCaption == “Form1” )
{
if( Form1 == NULL )
{
Form1=new TForm1(NULL);
Form1->Parent=wcParent;
}
Form1->Show();
}
else
…
}
MyDeleteForm(AnsiString asCaption)
{
if( asCaption == “Form1” )
{
delete Form1;
Form1=NULL;
}
}
当然,还需要自己处理resize事件,以保证子窗体在主窗体最大最小时保持一致。