关于DLL回调主程序窗体的问题,急~~,请帮帮忙
步骤是这样的:
1、在DLL中触发事件是,向主程序发送消息,并向共享内存中输入需要共享的数据。
2、主程序窗体接收到消息,执行对应的XX过程。
3、XX过程是调用主程序中的业务窗体,关键是用showmodal的方式打开窗体。
问题是:步骤1、2都可是实现,但是在XX过程中生成窗体实例,并在关闭时free窗体后,当我关闭整个主程序时,系统会提示内存错误。
XX过程如下:
var
FrmBusiForm :TFrmBusiForm;
isOk :boolean;
begin
if not Assigned(FrmBusiForm) then
begin
FrmBusiForm:= TFrmBusiForm.Create(Application);
//注:Application在调用DLL时作为参数传入,DLL中的窗体为MDI的子窗体
end;
FrmBusiForm.ShowModal;
isOk := FrmBusiForm.mSaveOk;
FrmBusiForm.free //这一句不能够解决问题
//FreeAndNil(FrmBusiForm); //这一句不能够解决问题
我查过比较多的相关问题,怀疑是,在生成窗体时,在堆栈里插入该窗体,然后当dll释放时,将该窗体指向的对象和控件全部释放了,导致当主程序退出时,无法查找到堆中窗体指针的指向内存。
附上bittcn(Ocean Wave) 大侠写的一点:
“1.我所说的注册机制,就是大家在写DLL时都遵循的一种编程约定。
窗体初始化时向主窗体发送一个消息,主窗体在收到消息后,在自己维护的队列中查找是否这个窗体已经有实例,如果是,这将这个窗体置在顶层,不在创建这个窗体的实例;否则,创建这个窗体的实例,并在主窗体的窗体队列中加入这个窗体的指针;窗体在关闭前,也通过消息操作主窗体中的这个队列。 主窗体根据自己的这个队列,维护Window菜单。”
不知道我理解的是不是正确,并且如何向“主窗体的窗体队列中加入这个窗体的指针”,请各位大侠帮帮忙!~~谢谢!~~