title: C# System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command
body: <p>After running my application (.Net 4.5, 64-bit, WPF) a long time (one to two weeks) I encounter the following app crash:</p>
  
  <pre><code>Faulting application name: XY.exe, Version: 2.12.2.2, Time: 0x5bade142
  Faulting module name: KERNELBASE.dll, Version: 6.1.7601.24150, Time: 0x5b0cbc65
  Exception code: 0xe0434352
  Fault offset: 0x000000000001a06d
  Faulting process id: 0x8694
  Faulting application start time: 0x01d457228a130410
  Faulting application path: C:\Testsysteme\YY.exe
  Faulting module path: C:\Windows\system32\KERNELBASE.dll
  Report Id: dbfc630b-c61f-11e8-bc27-1866da0d15ef
  
  Application: XY.exe
  Frameworkversion: v4.0.30319
  Description: The process was terminated due to an unhandled exception
  Exception information: System.ComponentModel.Win32Exception
  at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D)
  at MS.Win32.HwndWrapper..ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.String, IntPtr, MS.Win32.HwndWrapperHook[])
  at System.Windows.Interop.HwndSource.Initialize(System.Windows.Interop.HwndSourceParameters)
  at System.Windows.Interop.HwndSource..ctor(System.Windows.Interop.HwndSourceParameters)
  at System.Windows.Controls.Primitives.Popup+PopupSecurityHelper.BuildWindow(Int32, Int32, System.Windows.Media.Visual, Boolean, System.Windows.Interop.HwndSourceHook, System.Windows.AutoResizedEventHandler)
  at System.Windows.Controls.Primitives.Popup.BuildWindow(System.Windows.Media.Visual)
  at System.Windows.Controls.Primitives.Popup.CreateWindow(Boolean)
  at System.Windows.Controls.Primitives.Popup.OnIsOpenChanged(System.Windows.DependencyObject, System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.DependencyObject.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.FrameworkElement.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.DependencyObject.NotifyPropertyChange(System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.EntryIndex, System.Windows.DependencyProperty, System.Windows.PropertyMetadata, System.Windows.EffectiveValueEntry, System.Windows.EffectiveValueEntry ByRef, Boolean, Boolean, System.Windows.OperationType)
  at System.Windows.DependencyObject.SetValueCommon(System.Windows.DependencyProperty, System.Object, System.Windows.PropertyMetadata, Boolean, Boolean, System.Windows.OperationType, Boolean)
  at System.Windows.Data.BindingOperations.SetBinding(System.Windows.DependencyObject, System.Windows.DependencyProperty, System.Windows.Data.BindingBase)
  at System.Windows.Controls.Primitives.Popup.CreateRootPopup(System.Windows.Controls.Primitives.Popup, System.Windows.UIElement)
  at System.Windows.Controls.ToolTip.OnIsOpenChanged(System.Windows.DependencyObject, System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.DependencyObject.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.FrameworkElement.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.DependencyObject.NotifyPropertyChange(System.Windows.DependencyPropertyChangedEventArgs)
  at System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.EntryIndex, System.Windows.DependencyProperty, System.Windows.PropertyMetadata, System.Windows.EffectiveValueEntry, System.Windows.EffectiveValueEntry ByRef, Boolean, Boolean, System.Windows.OperationType)
  at System.Windows.DependencyObject.SetValueCommon(System.Windows.DependencyProperty, System.Object, System.Windows.PropertyMetadata, Boolean, Boolean, System.Windows.OperationType, Boolean)
  at System.Windows.DependencyObject.SetValue(System.Windows.DependencyProperty, System.Object)
  at System.Windows.Controls.PopupControlService.RaiseToolTipOpeningEvent()
  at System.Windows.Threading.DispatcherTimer.FireTick(System.Object)
  at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
  at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
  at System.Windows.Threading.DispatcherOperation.InvokeImpl()
  at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
  at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
  at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
  at MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
  at System.Windows.Threading.DispatcherOperation.Invoke()
  at System.Windows.Threading.Dispatcher.ProcessQueue()
  at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
  at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
  at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
  at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
  at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
  at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
  at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
  at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
  at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
  at System.Windows.Application.RunDispatcher(System.Object)
  at System.Windows.Application.RunInternal(System.Windows.Window)
  at XY.App.Main()
  </code></pre>
  
  <p>Logging of the unhandled exception additionally showed: </p>
  
  <pre><code>System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command
  </code></pre>
  
  <p>I already found a link with a basic description of the problem <a href="https://web.archive.org/web/20130727034302/https://connect.microsoft.com/VisualStudio/feedback/details/620588/system-componentmodel-win32exception-0x80004005-not-enough-storage-is-available-to-process-this-command" rel="nofollow noreferrer">connect.microsoft.com on web.archive.org</a> and I downloaded an ran the AtomMonitor from <a href="https://github.com/JordiCorbilla/atom-table-monitor" rel="nofollow noreferrer">JordiCorbilla/atom-table-monitor
   (GitHub)</a>. Indeed I found an increasing number of RWM Atoms created by my application over time (approx 4000 after some days). This fits to the exception message. All strings look like the following:</p>
  
  <pre><code>C1FE = HwndWrapper[XY.exe;;b68ce81a-d29f-414b-b63a-3b6979e33dd3]  --RWM
  </code></pre>
  
  <p>From the exception message I see that a 'Popup' is causing a <code>RegisterClassEx</code> from within the <code>OnIsOpenChanged</code> method.</p>
  
  <p>However, opening and closing several popups in my application and monitoring the count of RWM atoms in parallel, I can't see any increase, that's why I can't find the exact source of the problem. Just after some time, when looking at the statistics again I can see that the count increased.</p>
  
  <p>So my questions are:</p>
  
  <ol>
  <li><p>Can a <code>Popup</code> be responsible for raising the count of RWM atoms? If yes, is this a bug? Why does it create a new <code>Window</code> and registers these atoms?</p></li>
  <li><p>Do I use the <code>Popup</code> in a wrong way? Do I have to close/dispose/release something?</p></li>
  <li><p>Is the <code>Popup</code> the problem at all?</p></li>
  <li><p>What is the 'normal' number of RWM atoms an application creates or should not exceed, because as far as I know they can't be deleted anymore.</p></li>
  </ol>