C# Win32Exception 没有足够的存储空间来处理此命令
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/548971/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Win32Exception Not enough storage is available to process this command
提问by Vegard Larsen
Through my automated crash collection for MaxToI got the following crash report:
通过我的MaxTo自动崩溃收集,我得到了以下崩溃报告:
V8.12.0.0 - System.ComponentModel.Win32Exception - :Void UpdateLayered():0
Version: MaxTo8.12.0.0
Exception: System.ComponentModel.Win32Exception
Error message: Not enough storage is available to process this command
Stack trace:
at System.Windows.Forms.Form.UpdateLayered()
at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmCreate(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at MaxTo.MainForm.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Another stacktrace:
另一个堆栈跟踪:
Version: MaxTo2009.9.0.0
Exception: System.ComponentModel.Win32Exception
Error message: Not enough storage is available to process this command
Stack trace:
at System.Windows.Forms.Form.UpdateLayered()
at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmCreate(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
In this latest stack trace there is no reference to MaxTo at all, and 90% of the crashes I get are with stack traces similar to the above.
在这个最新的堆栈跟踪中,根本没有提到 MaxTo,我遇到的 90% 的崩溃都是与上述类似的堆栈跟踪。
Reading around on the net I find that this error is usual if you forget to release or dispose variables. When looking through my WndProc
, which seems to sometimes have the problem pass through, I cannot find a single place that hangs on to references to any objects. All but one of the variables are local to WndProc, and should therefore be garbage collected when the method terminates.
在网上阅读我发现如果你忘记释放或处理变量,这个错误是很常见的。在查看 my 时WndProc
,似乎有时会出现问题,但我找不到一个地方可以挂起对任何对象的引用。除了一个变量之外的所有变量都是 WndProc 的本地变量,因此应该在方法终止时进行垃圾回收。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m); // I'm assuming the first trace can be caught here
IntPtr hwnd = m.WParam;
// Our hook tells us something got maximized
if (Win32Import.UWM_MAXIMIZE == (UInt32)m.Msg)
{
// Figure out if we are temporarily disabled or using alternative profiles
KeyStateInfo keyState = KeyboardInfo.GetKeyState(Settings.AlternativeProfileKey);
Rectangle r = FindRectangle(MousePosition, (Settings.EnableAlternativeProfile && keyState.IsPressed ? AlternativeRegions : Regions));
// Did we find a rectangle to place it in?
if (r != Rectangle.Empty)
{
Rectangle position = Win32Import.GetWindowRectangle(hwnd);
Rectangle previousPos = GetLocation(hwnd);
if (position == r && previousPos != Rectangle.Empty)
{
// We are restoring the original position
Win32Import.SetWindowPos(hwnd, IntPtr.Zero, previousPos.X, previousPos.Y, previousPos.Width, previousPos.Height, Win32Import.SWP_NOZORDER | Win32Import.SWP_NOSENDCHANGING);
}
else
{
// We are maximizing to a region
Win32Import.ShowWindow(hwnd, Win32Import.WindowShowStyle.Restore);
Win32Import.SetWindowPos(hwnd, IntPtr.Zero, r.X, r.Y, r.Width, r.Height, Win32Import.SWP_NOZORDER | Win32Import.SWP_NOSENDCHANGING);
// Make sure we remember this location
RememberLocation(hwnd, position);
}
}
}
else if (MaxTo64WindowHandleMessage == m.Msg)
{
// Store the window handle of our 64-bit subprocess
SubProcess64WindowHandle = m.WParam;
}
}
I have not been able to reproduce the error, even while running the program over multiple days.
即使在多天运行程序时,我也无法重现该错误。
My assumption is that the system is low on either unfragmented memory or GDI handles, but I cannot confirm this anywhere. There does not seem to be any good documentation on this error.
我的假设是系统在未碎片化内存或 GDI 句柄上都很低,但我无法在任何地方确认这一点。似乎没有关于此错误的任何好的文档。
Any ideas what else it could be? Can I do anything to prevent this error?
任何想法它可能是什么?我能做些什么来防止这个错误吗?
Update: The question was reopened with more stack traces, because of the lack of a decent solution. Simply ignoring it does not solve the problem.
更新:由于缺乏合适的解决方案,问题以更多的堆栈跟踪重新打开。简单地忽略它并不能解决问题。
回答by Lars Truijens
Leaking or using to many GDI objects/handles. Those could cause a resource heap shortage. You might not be able to reproduce because your users might have other GDI resource heavy programs running or use Terminal Server in which case they have to share some of the heap with the other users. See System Error. Code: 8. Not enough storage is available to process this command
泄漏或使用了许多 GDI 对象/句柄。这些可能会导致资源堆短缺。您可能无法重现,因为您的用户可能正在运行其他 GDI 资源繁重的程序或使用终端服务器,在这种情况下,他们必须与其他用户共享一些堆。请参阅系统错误。代码:8. 没有足够的存储空间来处理此命令
Hereyou can read about the Desktop Heap Monitor tool to diagnose desktop heap problems.
在这里,您可以阅读有关用于诊断桌面堆问题的桌面堆监视器工具的信息。
回答by Hans Passant
Your program is probably leaking kernel resources. Start diagnosing this problem with Taskmgr.exe. View + Select Columns, check User objects, GDI objects and Handle count. Run your program and observe if any of these is increasing steadily. Once one of them reaches 10,000 your program will die.
您的程序可能正在泄漏内核资源。使用 Taskmgr.exe 开始诊断此问题。查看 + 选择列,检查用户对象、GDI 对象和句柄计数。运行您的程序并观察其中任何一个是否稳定增加。一旦其中之一达到 10,000,您的程序就会死亡。
With a way to quickly see the leak in action, you can start commenting code to see where the leak occurs. It probably has something to do with your "hook".
通过一种快速查看泄漏情况的方法,您可以开始注释代码以查看泄漏发生的位置。它可能与您的“钩子”有关。
回答by snemarch
The problem probably dones't lie in your WndProc - the reason you see it in your call stacks is because pretty much everything GUI-related on Windows go through the WIN32 window procedure. Overriding it in your control simply gives you a hook point to process low-level stuff before higher-level .NET framework processing is done.
问题可能不在于您的 WndProc - 您在调用堆栈中看到它的原因是因为 Windows 上与 GUI 相关的几乎所有内容都通过 WIN32 窗口过程。在您的控件中覆盖它只会为您提供一个挂钩点,以便在高级 .NET 框架处理完成之前处理低级内容。
This is going to be a completeshot in the dark, but perhaps this postcould be relevant? - probably not with those stack traces, though.
这将是黑暗中的一个完整镜头,但也许这篇文章可能是相关的?- 不过,可能不是那些堆栈跟踪。
回答by Eugene Bosikov
I had many custom Windows controls with own resources, so when I create many controls this error is appear. To fix this problem I made Resource file in my library and used outside resources instead of resources on my component code. After that my exception is gone, already tested with 3 times more opened forms and this error gone. So looks like it's a solution.
我有许多具有自己资源的自定义 Windows 控件,因此当我创建许多控件时会出现此错误。为了解决这个问题,我在我的库中创建了 Resource 文件,并在我的组件代码中使用了外部资源而不是资源。在那之后,我的异常消失了,已经用 3 倍多的打开表单进行了测试,这个错误消失了。所以看起来这是一个解决方案。