zoukankan      html  css  js  c++  java
  • 为什么调用 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);
    
  • 相关阅读:
    【转载】Java for循环
    JAVA如何判断两个字符串是否相等
    JQuery DataTable的配置项及事件
    JAVA中对list map根据map某个key值进行排序
    JAVA补0--->String.format()的使用
    【转载】Java DecimalFormat 用法
    Java集合类
    jQuery中ajax的4种常用请求方式
    POI之下载模板(或各种文件)
    【转载】java 获取路径的各种方法
  • 原文地址:https://www.cnblogs.com/cheungxiongwei/p/9999167.html
Copyright © 2011-2022 走看看