WinCE平台下C#引用API(GDI)一个值得警惕的内存泄漏

简介:
+关注继续查看

由于C#精简框架集绘图函数不支持圆角矩形,所以引用了相关的API。

 


  1. [DllImport("\\windows\\coredll.dll", EntryPoint = "RoundRect")]  
  2.         private static extern int CeRoundRect(IntPtr hdc, int X1, int Y1, int X2, int Y2, int X3, int Y3);  

 这是有内存泄漏的源码:

 


  1. public static int RoundRect(Graphics e, Pen pen, SolidBrush brush, int X1, int Y1, int X2, int Y2, int X3, int Y3)  
  2.         {           
  3.             IntPtr hpen;  
  4.             IntPtr hbrush;  
  5.  
  6.             if(pen!=null)  
  7.             {  
  8.                 hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,  
  9.                 (int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));      //创建GDI画笔    
  10.             }  
  11.             else  
  12.             {  
  13.                 hpen = GetStockObject(8);      //空画笔  
  14.             }            
  15.  
  16.             if (brush!= null)  
  17.             {  
  18.                 hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());  
  19.             }  
  20.             else  
  21.             {  
  22.                 hbrush = GetStockObject(5);  
  23.             }  
  24.  
  25.             //pen.Dispose();  
  26.             //brush.Dispose();  
  27.  
  28.             IntPtr hdc = e.GetHdc();  
  29.             //---------------------     
  30.              SelectObject(hdc, hbrush);  
  31.              SelectObject(hdc, hpen);  
  32.  
  33.             int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);  
  34.  
  35.             DeleteObject(hbrush);  
  36.             DeleteObject(hpen);  
  37.             //---------------------  
  38.             e.ReleaseHdc(hdc);  
  39.             return intRet;  
  40.         }  
  41.  

这是没有问题的源码:


  1. public static int RoundRect(Graphics e, Pen pen, SolidBrush brush, int X1, int Y1, int X2, int Y2, int X3, int Y3)  
  2.        {           
  3.            IntPtr hpen,old_pen;  
  4.            IntPtr hbrush, old_brush;  
  5.  
  6.            if(pen!=null)  
  7.            {  
  8.                hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,  
  9.                (int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));      //创建GDI画笔    
  10.            }  
  11.            else 
  12.            {  
  13.                hpen = GetStockObject(8);      //空画笔  
  14.            }            
  15.  
  16.            if (brush!= null)  
  17.            {  
  18.                hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());  
  19.            }  
  20.            else 
  21.            {  
  22.                hbrush = GetStockObject(5);  
  23.            }  
  24.  
  25.            //pen.Dispose();  
  26.            //brush.Dispose();  
  27.  
  28.            IntPtr hdc = e.GetHdc();  
  29.            //---------------------     
  30.            old_brush=SelectObject(hdc, hbrush);  
  31.            old_pen=SelectObject(hdc, hpen);  
  32.              
  33.            int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);  
  34.  
  35.            SelectObject(hdc, old_brush);  
  36.            SelectObject(hdc, old_pen);  
  37.            DeleteObject(hbrush);  
  38.            DeleteObject(hpen);  
  39.            //---------------------  


            e.ReleaseHdc(hdc);
            return intRet;
        }

       看出代码的区别来了没有?泄漏的原因其实很简单,就是没有重新选入旧的画笔画刷。同样的程序(当然PC端的API库是GDI32)在上位机Window XP平台上没有什么问题(测试大约3天以上),而在WinCE平台确非常明显,大约1~3个小时(视圆角矩形绘图的多寡而定),该程序就会内存耗尽而死。


















本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323438,如需转载请自行联系原作者

相关文章
|
2月前
|
JSON Java API
LAZADA平台API文档示例
LAZADA平台API文档示例
112 0
|
2月前
|
JavaScript 前端开发 数据可视化
TradingView量化交易平台API对接开发部署实现
TradingView量化交易平台API对接开发部署实现
|
3月前
|
JSON API 数据安全/隐私保护
【Django学习】(十五)API接口文档平台_项目流程分析_日志器_认证_授权
【Django学习】(十五)API接口文档平台_项目流程分析_日志器_认证_授权
|
3月前
|
PHP
PHP实现自制随机图片API- 调用文件夹和引用网络图片
PHP实现随机图片API- 调用文件夹和引用网络图片
31 0
|
4月前
|
JSON 人工智能 机器人
Python|Python引用图灵机器人api
Python|Python引用图灵机器人api
70 0
|
SQL 存储 JavaScript
Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等等。
337 0
Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
|
Java API Maven
api重复引用导致的诡异问题排查
api重复引用导致的诡异问题排查 最近一个项目上线前开发环境、测试环境都能正常打包并运行。然而到了准生产环境和生产环境则报一些诡异的错误信息: [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.
1010 0
|
API Android开发
关于android源码中的APP编译时引用隐藏的API出现的问题
今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的APP是可以使用隐藏的API的,为什么这个不行? 百思不得其解,最后通过对比mk文件发现,在计算机的mk文件中多了一句:LOCAL_SDK_VERSION := current,顿时发现问题所在 注释掉这句之后,重新mmm编译通过。
819 0
|
API C#
WinCE平台下C#引用API(GDI)一个值得警惕的内存泄漏
由于C#精简框架集绘图函数不支持圆角矩形,所以引用了相关的API。  [DllImport("//windows//coredll.
473 0
热门文章
最新文章
相关产品
云迁移中心
推荐文章
更多