SafeGdiplusStartupToken.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using System;
  2. using System.Diagnostics.CodeAnalysis;
  3. using System.Runtime.ConstrainedExecution;
  4. using Microsoft.Win32.SafeHandles;
  5. namespace Standard;
  6. internal sealed class SafeGdiplusStartupToken : SafeHandleZeroOrMinusOneIsInvalid
  7. {
  8. private SafeGdiplusStartupToken() : base(true)
  9. {
  10. }
  11. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
  12. protected override bool ReleaseHandle()
  13. {
  14. Status status = NativeMethods.GdiplusShutdown(this.handle);
  15. return status == Status.Ok;
  16. }
  17. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
  18. [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
  19. [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")]
  20. public static SafeGdiplusStartupToken Startup()
  21. {
  22. SafeGdiplusStartupToken safeGdiplusStartupToken = new SafeGdiplusStartupToken();
  23. IntPtr handle;
  24. StartupOutput startupOutput;
  25. if (NativeMethods.GdiplusStartup(out handle, new StartupInput(), out startupOutput) == Status.Ok)
  26. {
  27. safeGdiplusStartupToken.handle = handle;
  28. return safeGdiplusStartupToken;
  29. }
  30. safeGdiplusStartupToken.Dispose();
  31. throw new Exception("Unable to initialize GDI+");
  32. }
  33. }