• 为什么调用 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);
    
  • 相关阅读:
    Django学习-9-ORM多对多操作
    Django学习-8-模板渲染的一些特性
    Django学习-7-ORM操作
    Django学习-6-路由系统
    Hadoop 知识
    最全的Spark基础知识解答
    windows server 2008 R2 远程连接用户数修改
    Windows 2008 R2 SP1部署WSUS 3.0 SP2
    Windows Server2008 R2 设置NAT 让Hyper-V连接Internet
    免费好用的Microsoft iSCSI Software Target 3.3
  • 原文地址:https://www.cnblogs.com/cheungxiongwei/p/9999167.html
Copyright © 2020-2023  润新知