高手求教:VCL 的怪现象

ddev2000 2002-11-25 01:06:10
说明:该问题原登录在大富翁论坛上,却少有人答复,只得再求救于 CSDN
的高手了....
===================================================================

MDI 应用,一个子窗体,是作为容器用的,加载的内容同样是一个窗体,
不过是在 DLL 中。基本过程如下:
1、子窗体调用入口(D5E):
function ShowDllForm(hParentWnd: HWND, ...): HWND; stdcall;
{
DllForm := TDllForm.CreateParented(hParentWnd);
Result := DllForm.Handle;
...
}

2、主调用(BCB5E)
在子窗体 OnShow 及 OnResize 中同时处理,
其中 hDllWnd 为调用窗体(DLL窗体)的句柄:
HWND __fastcall XXXMDI::ShowDllForm(void)
{
HMODULE hDllModule = theApp->hDllModule;
HWND hWnd = NULL;
if (FAttachProject != NULL && hDllModule != NULL)
{
typedef HWND (DLL_PROC)(HWND, const char*, int);
DLL_PROC* lpDllProc = (DLL_PROC*)GetProcAddress(hDllModule, "ShowDllForm");
if (lpDllProc != NULL)
hWnd = (*lpDllProc)(Handle, AFileName.c_str(), dwFlag); }
}
return hWnd;
}

void __fastcall XXXMDI::OnFormResize(...)
{
//如果 DLL 窗体没有加载,则加载
if (hDllWnd == NULL)
hDllWnd = ShowDllForm();

//调整窗体大小
if (hDllWnd != NULL)
SetWindowPos(hDllWnd, HWND_TOP,
0, 0, ClientWidth, ClientHeight,
SWP_SHOWWINDOW);
}

问题说明:在加载及程序本身运行过程全部正常,在退出程序时,
如果先把 XXXMDI 子窗体关闭,然后再关闭主窗体,也正常,但
如果先不关闭该子窗体而直接关闭程序,则出错,看 CPU 调试,
出现调试地址的内容全部为 ??? 。要说明的是,出错肯定是在该
载有 DLL 的窗体上,其他过程全部正常。

现在调试点发现:
在 XXXMDI 子窗体关闭过程中,单步进行,一直能够进行到函数结束,
但随后就显示出错!用 try{}__finally{}也无法屏蔽,可以说已经是
系统内存读写错。为什么会这样呢???

还有一点:在 DEBUG 状态下,MDI 窗体的 OnResize 事件处理
的 DLL 窗口大小调整有效(即能正常最大化);而在 RELEASE
状态下,却发现 DLL 窗口总是不断被重新创建(很明显,所有
的状态全部被回复!真奇怪),而且根本不响应 SetWindowPos
函数的调整!

继续调试发现:
如果强制发出 WM_DESTROY,关闭每个窗体,则程序可以正常退出(调试状态),
即关闭子窗体过程中,先发 WM_CLOSE, 继续再发 WM_DESTROY。程序就完全正常了。

但 ---------- 更大的问题在后面(Release 状态):
1、如果 stack frames (C 编译) 关闭(未核选),则出现每次 MDI 窗体大小调整时,都会重新创建 DLL 窗体!而且窗体位置根本就不动(挂在右下脚,就是不能正常最大化);

2、如果打开全部 stack frames 选项,窗体最大最小化正常,但这时出现:
priviledge instruction 错误信息,叫什么?我还是第一次遇到,强制权限?
最后关闭程序时,出现无效内存调用!同以前一样!不知道为什么?

如果关闭 PASCAL 中的stack frames ,则出现 external exception XXXXXXXX,
外部异常!到这儿,可以肯定是 RTTI 出现问题,估计 BCB 在处理
DLL 中的 VMT 和应用中的 VMT 时,用了什么“VCL”的手法,
导致数据交换出现严重异常!VCL 在宿主问题上,到底有什么特殊
的方法(但显然是不安全的,或者说是不干净的!)呢?
==========================================================================

急死了,请教各位大侠帮帮我分析一下错误原因吧...

...全文
41 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddev2000 2002-12-01
  • 打赏
  • 举报
回复
宝兰主页好象只有 Update1 啊,
TO weibz0525(小虫) :麻烦你再帮帮忙,找一下告诉我好吗?

我对新出的 BCB6 有点不放心,Borland 在她的新版中总会溶
进太多的新技术,有时候反而会不是太稳定。BCB5E 虽然慢(编译),
但大体还是蛮好的,暂是还不想改啊...
weibz0525 2002-11-30
  • 打赏
  • 举报
回复
到google.com打“宝兰”或者干脆去borland.com主页去下载吧,我以前下载的地方我也忘记了!
ddev2000 2002-11-30
  • 打赏
  • 举报
回复
to EastenChild(天高云淡):
请问,哪儿有 SP2 for BCB5E 下载?
redcony 2002-11-25
  • 打赏
  • 举报
回复
不知你的Dll写时选没选Rtl和runtime package
EastenChild 2002-11-25
  • 打赏
  • 举报
回复
天可怜见...
有可能是BCB本身的问题,你可以去下载他的ServicePack2,100多M吧,绝大多数是更新了其RTL,这有可能有关系。
但Release版的问题不能强求,他作了很多优化,以至于有可能将某些语句省略,然而这还是应当归于程序的也许有不严格之处。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧