Delphi 2009 VCL 源码中一处可能导致死循环的 Bug(200分)

  • 主题发起人 主题发起人 Passion
  • 开始时间 开始时间
P

Passion

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi 2009/2007 的 source/Win32/vcl/Forms.pas 中,GetNonToolWindowPopupParent 函数实现部分:
function GetNonToolWindowPopupParent(WndParent: HWND): HWND;
begin
Result := GetParent(WndParent);
while (Result <> 0) and (GetWindowLong(Result, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = WS_EX_TOOLWINDOW)do
Result := GetParent(WndParent);
... // 以下省略

很明显,如果第一次进入 while 时判断成立,那么 Result 的值就始终是 WndParent 的 Parent,也就没机会跳出循环了。Result := GetParent(WndParent);
应该改成 Result := GetParent(Result);
才对。
GetNonToolWindowPopupParent 是在 TCustomForm 的 CreateParams 中被调用的,也就是说某些窗口在 Create 的时候,可能就会碰上这个死循环,导致程序挂在这个窗体 Create 的过程中。
网上没搜到这个 Bug 的相关内容,可能一般人的程序中都不会进入这个 while,但 CnPack IDE 专家包的某些窗体代码偏偏就进入了这个 while,导致 IDE 失去响应,然后在调试过程中才找到这个死循环问题所在。
Delphi 2009 Update 1 中仍旧存在此问题,并且以前的 BDS 中貌似也有此问题。目前还在想办法看如何绕过它。
第一回发现 VCL 源码的 Bug,庆祝散分。;-)
 
学习,接分
 
[:)][:)][:)]支持。。。。。。哪里下载这个版本的绿色版呢?
 
我说怎么会提到 cnpack,一看lz是Passion!呵,接分喽
 
谢谢提供,抄袭,抄袭了
 
http://cc.codegear.com/item/26216
这里下载 补丁
 
LZ,你是不是用的是测试版啊.正式版没拿到,不做评论
 
感谢一下楼主,cnpack我很喜欢
 
我也应该好好学习学习...
 
看这个函数的用处是查找WND的非WS_EX_TOOLWINDOW样式PARENT的WND,
确实是BUG,把这个PAS改了后,放在工程目录中,然后把这个新PAS加到项目中就OK了。
 
bmsr, 你发的那个听说是DSU的作者Andy发现的一个bug,HideStackTrashingFix is a bugfix unit that fixes QC #66892 (Closing forms deactivates the application).
是少了个stdcall, 和我说的问题不是同一个。
 
补充了躲过这个问题的两个方法。
 
多人接受答案了。
 
后退
顶部