为什么调用 GdiplusShutdown 函数会在 DllExports::GdipDeleteGraphics(nativeGraphics) 位置抛出异常?

因为没有仔细看文档

https://docs.microsoft.com/en-us/windows/desktop/api/Gdiplusinit/nf-gdiplusinit-gdiplusshutdown

You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.

抛异常

	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
	
		HDC deskTop = GetDC(NULL);
		int nBitPerPixel = GetDeviceCaps(deskTop, BITSPIXEL);
		int nWidth = GetDeviceCaps(deskTop, HORZRES);
		int nHeight = GetDeviceCaps(deskTop, VERTRES);
		//int center
		Gdiplus::Graphics graphics(deskTop);
		graphics.TranslateTransform(nWidth / 2, nHeight / 2);
		Gdiplus::Image *image = new Gdiplus::Image(L"D:\456.png");

		printf("%dx%d BitPerPixel = %d
", nWidth, nHeight, nBitPerPixel);
		graphics.DrawImage(image, -256 / 2, -256 / 2, 256, 256);

		delete image;
		image = nullptr;
		ReleaseDC(NULL, deskTop);
	
	Gdiplus::GdiplusShutdown(gdiplusToken);

使用 {} 大阔号把 gdi+ 的对象作用域分开,当离开作用域时,此时 gdi+ 对象的使用资源会释放掉,然后调用 Gdiplus::GdiplusShutdown(gdiplusToken); 函数就不会抛异常了。you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.

	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
	{
		HDC deskTop = GetDC(NULL);
		int nBitPerPixel = GetDeviceCaps(deskTop, BITSPIXEL);
		int nWidth = GetDeviceCaps(deskTop, HORZRES);
		int nHeight = GetDeviceCaps(deskTop, VERTRES);
		//int center
		Gdiplus::Graphics graphics(deskTop);
		graphics.TranslateTransform(nWidth / 2, nHeight / 2);
		Gdiplus::Image *image = new Gdiplus::Image(L"D:\456.png");

		printf("%dx%d BitPerPixel = %d
", nWidth, nHeight, nBitPerPixel);
		graphics.DrawImage(image, -256 / 2, -256 / 2, 256, 256);

		delete image;
		image = nullptr;
		ReleaseDC(NULL, deskTop);
	}
	Gdiplus::GdiplusShutdown(gdiplusToken);
原文地址:https://www.cnblogs.com/cheungxiongwei/p/9999167.html