我们有几个Win32应用程序(在Delphi 2006中编码),有时用户会收到一条错误消息“系统错误。代码:8.没有足够的存储可用于处理此命令。
从stacktrace看起来它总是在CreateWnd调用期间
Main ($1edc): 004146cc +070 app.exe SysUtils RaiseLastOSError 00414655 +005 app.exe SysUtils RaiseLastOSError 004ce44c +130 app.exe Controls TWinControl.CreateWnd 00535a72 +022 app.exe cxControls TcxControl.CreateWnd 004ce82a +016 app.exe Controls TWinControl.CreateHandle 00553d21 +005 app.exe cxContainer TcxContainer.CreateHandle 00586ef1 +005 app.exe cxEdit TcxCustomEdit.CreateHandle 005c331d +005 app.exe cxDropDownEdit TcxCustomDropDownEdit.CreateHandle 004ceaf0 +074 app.exe Controls TWinControl.UpdateShowing 004ceb1e +0a2 app.exe Controls TWinControl.UpdateShowing 004cebdc +03c app.exe Controls TWinControl.UpdateControlState 004d118a +026 app.exe Controls TWinControl.CMVisibleChanged 004cb713 +2bb app.exe Controls TControl.WndProc 004cf569 +499 app.exe Controls TWinControl.WndProc 004b727d +4c1 app.exe Forms TCustomForm.WndProc 004cb3a0 +024 app.exe Controls TControl.Perform 004c9f6a +026 app.exe Controls TControl.SetVisible 004b6c46 +03a app.exe Forms TCustomForm.SetVisible 004baf1b +007 app.exe Forms TCustomForm.Show 004bb151 +14d app.exe Forms TCustomForm.ShowModal 007869c7 +0d3 app.exe UfrmPrice 770 +19 TfrmPrice.EditPrice 0078655d +009 app.exe UfrmPrice 628 +0 TfrmPrice.actNewBidExecute 00431ce7 +00f app.exe Classes TBasicAction.Execute 004c2cb5 +031 app.exe ActnList TContainedAction.Execute 004c397c +050 app.exe ActnList TCustomAction.Execute 00431bb3 +013 app.exe Classes TBasicActionLink.Execute 004af384 +090 app.exe Menus TMenuItem.Click 004b059f +013 app.exe Menus TMenu.DispatchCommand 004b16fe +082 app.exe Menus TPopupList.WndProc 004b164d +01d app.exe Menus TPopupList.MainWndProc 004329a8 +014 app.exe Classes StdWndProc 7e4196b2 +00a USER32.dll DispatchMessageA 004bea60 +0fc app.exe Forms TApplication.ProcessMessage 004bea9a +00a app.exe Forms TApplication.HandleMessage 004becba +096 app.exe Forms TApplication.Run 008482c5 +215 app.exe AppName 129 +42 initialization
我从来没有能够到底是什么导致这一点,因为它发生很少,我没有关心,但我想找出原因,并希望纠正它…
编辑:全栈跟踪
编辑2:更多信息…今天经历过的客户端已经安装了我的应用程序大约4个月,它是在他的电脑上运行每天8小时。这个问题只出现在今天,并保持重现,即使他杀了我的应用程序,并重新启动它。他的系统上没有其他应用程序表现得奇怪。重新启动后问题完全消失。这是否指向Steve提到的堆短缺?
编辑3:有趣的msdn博客文章here和here关于桌面堆的话题。虽然我不知道这是否是这个问题的原因,它肯定看起来可能。
解决方法
如果你的程序使用了大量的Windows资源,它可能是一个资源堆短缺。
有一个注册表项可以增加来提高XP的堆大小。对于Vista,Microsoft已经将默认值设置为更高。我建议将默认值3072更改为至少8192。
此信息记录在MS Knowledge Base(或搜索“内存不足”)。关于参数值的附加细节可以在文章KB184802中找到。
我建议你阅读知识库文章,但更改的基本信息是:
>运行注册表编辑器(REGEDT32.EXE)。
>从HKEY_ LOCAL_MACHINE子树,转到以下项:
\System\CurrentControlSet\Control\Session Manager\SubSystem
>在屏幕的右侧双击键:
windows
>在弹出窗口中,您将看到一个非常长的字段。将光标移动到字符串开头附近(值可能不同):
SharedSection=1024,3072,512
> SharedSection使用以下格式指定系统和桌面堆:SharedSection = xxxx,yyyy,zzz其中xxxx定义系统范围堆的最大大小(以千字节为单位),yyyy定义每个桌面堆的大小,zzz定义一个“非交互”窗口站的桌面堆的大小。
>将ONLY yyyy值更改为8192(或更大),然后按OK。
>退出注册表编辑器并重新启动PC以使更改生效。
祝你好运。