Win32Exception Pas assez de stockage disponible pour traiter cette commande

Par le biais de mon automatisé crash collection pour MaxTo j'ai eu la suite de rapport de crash:

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)

Un autre 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)

Dans cette dernière trace de la pile il n'y a aucune référence à MaxTo à tous, et 90% des collisions que je reçois sont avec des traces de pile similaire à ci-dessus.

Fouiller sur le net, j'ai trouver que cette erreur est d'habitude si vous oubliez de le rejet ou l'élimination des variables. Lors de la recherche par le biais de mon WndProcqui semble avoir parfois le problème de passer à travers, je ne trouve pas un seul endroit qui pèse sur les références à des objets. Toutes les variables sont locales à WndProc, et doivent donc être nettoyés lorsque la méthode se termine.

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;
    }
}

Je n'ai pas été en mesure de reproduire l'erreur, même lors de l'exécution du programme au cours de plusieurs jours.

Mon hypothèse est que le système est faible, soit fragmenté de la mémoire ou GDI poignées, mais je ne peux pas confirmer cela n'importe où. Il ne semble pas être une bonne documentation sur cette erreur.

Aucune idées de ce qu'elle pourrait être? Puis-je faire quelque chose pour éviter cette erreur?

Mise à jour: La question a été rouvert avec plus de traces de pile, en raison de l'absence d'une solution décente. De simplement l'ignorer ne résout pas le problème.

source d'informationauteur Vegard Larsen