DLL中使用Form问题
2004-07-04 22:44
721 查看
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
MyShouwForm(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事件,以保证子窗体在主窗体最大最小时保持一致。
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
MyShouwForm(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事件,以保证子窗体在主窗体最大最小时保持一致。
相关文章推荐
- 使用upd socket(SOCK_DGRAM)的时候,recvform超时的问题
- DLL文件中Form的使用
- [C#问题]WebBrowser在Form程序中使用的感想。
- [C#问题--WebBrowser继续追踪]WebBrowser在Form程序中使用的感想2
- 关于用c生成的dll在使用其他供应商的工具创建可执行模块时遇到的一些问题
- [C#问题--WebBrowser继续追踪]WebBrowser在Form程序中使用的感想3
- 在vc中的regular dll中使用ado的导入问题
- 关于使用vc++调用matlab生成的dll传递数组的问题
- 使用dll应注意的问题
- 在Delphi的DLL中使用FastReport要处理的几个问题
- 关于CList对象在DLL中的使用问题
- 在vc中的regular dll中使用ado的导入问题
- 使用Extjs的Form无法输入的问题
- 使用UrlRewrite时修改form的action属性问题
- Eclipse的SWT使用ViewForm,ToolBar,ToolItem兼容问题解决
- 使用jsf遇到的第2个问题,sub form,还是多个h:form?
- asp.net 2.0在使用了mater page的情况下Form defaultbutton无法设置的问题
- 再谈使用UrlRewrite时修改form的action属性问题
- 使用VC6调用DLL出现的问题(使用LoadLibrary返回值为0)
- 在最近做一个高级查询时遇见的问题,javascript在动态的form里使用会出现问题