`
isiqi
  • 浏览: 16484390 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

.Net程序开发中一个较为隐蔽的GDI泄露探析

阅读更多

最近一直在调试第三方委托开发的医疗输液系统(我接手时,代码已经完成,原则上我只修改接口部分以适应我们的硬件即可,不过调试过程中,该程序本身问题暴露不少),该系统用VB.net开发,该软件的图形界面是花费n多银子专门做的美工,大量的贴图,就是目前的主流PC机配置,也很难在调试模式下走顺溜。

问题出在两方面,第一、存在内存泄露(有时间我专门为此写篇文章),第二、存在GDI泄露。

最早的时候由于存在内存泄露问题,我一直以为windows弹出的“GDI一般性错误是由于内存泄露引起的,直到内存问题得以解决,程序还是运行一段时间就弹出类似错误。查了很多资料,发现windows任务管理器可以查看GDI是否泄露,如下图(在查看菜单,选定“选择列”对话框中gdi对象选项)

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 276.75pt; HEIGHT: 255.75pt" type="#_x0000_t75"><imagedata o:title="gdi07083101" src="file:///C:%5CDOCUME~1%5C%E5%8F%B6%E5%B8%86%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg"></imagedata></shape>

发现,该程序的GDI对象计数猛涨,由于没有很好的GDI检查工具和方法(如果这方面有高手,希望不吝指教),所以我对程序中大段大段涉及GDI的代码进行屏蔽,然后再检查是否GDI有泄露,n次重复后,功夫不负有心人,终于锁定罪魁祸首,相关代码如下:

Select Case (uPumpData.PumpName & "").Trim

Case "******"

IRBDetail.Icon = Icon.FromHandle(CType(ImgTabPage.Images(1), Bitmap).GetHicon)

Case "XXXXXX"

IRBDetail.Icon = Icon.FromHandle(CType(ImgTabPage.Images(0), Bitmap).GetHicon)

Case Else

IRBDetail.Icon = Nothing

End Select

问题就出在 Icon.FromHandle(CType(ImgTabPage.Images(1), Bitmap).GetHicon)这句代码上,msdn在关键时刻不辱使命,一查结果真相大白:

Icon.FromHandle 方法

从图标的指定 Windows 句柄 (HICON) 创建 GDI+ Icon

命名空间:System.Drawing
程序集:System.Drawing(在 system.drawing.dll 中)

Visual Basic(声明)

Public Shared Function FromHandle (handle As IntPtr ) As Icon

Visual Basic(用法)

Dim handle As IntPtr

Dim returnValue As Icon

returnValue = Icon.FromHandle(handle)

参数

handle 图标的 Windows 句柄。

返回值

此方法创建的 Icon

<shape id="remarksToggle" style="VISIBILITY: visible; WIDTH: 9pt; HEIGHT: 9pt" type="#_x0000_t75" alt="Collapse 图像" o:spid="_x0000_i1026"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5C%E5%8F%B6%E5%B8%86%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif"></imagedata></shape>备注

使用此方法时,必须使用 Win32 API 中的 DestroyIcon 方法释放产生的图标以确保释放相应资源。

<shape id="codeExampleToggle" style="VISIBILITY: visible; WIDTH: 9pt; HEIGHT: 9pt" type="#_x0000_t75" alt="Collapse 图像" o:spid="_x0000_i1027"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5C%E5%8F%B6%E5%B8%86%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif"></imagedata></shape>示例

下面的代码示例设计用于 Windows 窗体,它需要 PaintEventArgse(这是 Paint 事件处理程序的参数)。代码执行下列操作:

· 创建一个 Bitmap

· 将该对象绘制到屏幕。

· 获取 Bitmap 的图标句柄。

· 将窗体的 Form.Icon 属性设置为从该句柄创建的图标。

· 调用 Win32 API 函数 DestroyIcon 以释放资源。

<System.Runtime.InteropServices.DllImportAttribute("user32.dll")> _

Private Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean

End Function

Private Sub GetHicon_Example(ByVal e As PaintEventArgs)

' Create a Bitmap object from an image file.

Dim myBitmap As New Bitmap("c:\FakePhoto.jpg")

' Draw myBitmap to the screen.

e.Graphics.DrawImage(myBitmap, 0, 0)

' Get an Hicon for myBitmap.

Dim HIcon As IntPtr = myBitmap.GetHicon()

' Create a new icon from the handle.

Dim newIcon as Icon = System.Drawing.Icon.FromHandle(HIcon)

' Set the form Icon attribute to the new icon.

Me.Icon = newIcon

' Destroy the icon, since the form creates its

' own copy of the icon.

DestroyIcon(newIcon.Handle)

End Sub

注意,备注很关键:要用API DestroyIcon释放相关对象。

我声明了一个API函数:

Public Declare Function DestroyIcon Lib "user32" Alias "DestroyIcon" (ByVal hIcon As Integer) As Integer

IRBDetail.Icon的属性代码中添加了如下代码,问题立马解决(当然类销毁的代码中,m_Icon也要释放一下)。

Public Property Icon() As Icon

Get

Return m_Icon

End Get

Set(ByVal Value As Icon)

'叶帆 2007.08.31

If Not IsNothing(m_Icon) Then

DestroyIcon(m_Icon.Handle)

m_Icon.Dispose()

m_Icon = Nothing

End If

m_Icon = Value

Me.Invalidate()

End Set

End Property

千里之堤溃于蚁穴,几万行的代码,就坏在这一点上,实在值得人警惕!

分享到:
评论

相关推荐

    ASP.NET程序设计课程教学改革探析.pdf

    综上所述,ASP.NET程序设计课程教学改革是一个全方位的过程,包括教学内容的更新、教学方法的创新、教学手段的现代化以及评价体系的改革。这样的改革旨在培养出适应社会发展、具备实际操作能力和创新思维的高素质...

    浅谈微信小程序第三方开发及应用探析.pdf

    标题中提到的知识点为“微信小程序第三方开发及应用探析”,这意味着文档将围绕微信小程序的开发进行探讨,特别是关于第三方开发者如何参与小程序的开发以及他们在开发过程中的应用和实践。 从描述中未提供更多信息...

    在ASP.NET中SQL注入式攻击探析.pdf

    在ASP.NET中SQL注入式攻击探析.pdf

    .net的经典数据库

    本文将主要探讨.NET中的经典数据库应用,以“学生信息”为例,展示如何构建一个简单的数据库管理系统。 首先,我们要了解.NET中的基础——ADO.NET。ADO.NET是Microsoft提供的一种数据访问技术,它允许开发者直接与...

    Java程序设计语言在软件开发中的应用探析.pdf

    例如,广东某高校利用Java语言开发的电厂仿真系统就是一个成功的案例。 在金融软件领域,Java语言的应用同样广泛。许多国际知名的投资银行如高盛(Goldman Sachs)、花旗集团(Citigroup)、巴克莱银行(Barclays)...

    “云开发”模式探析及其对图书馆微信小程序应用的影响.pdf

    其次,云开发模式有助于图书馆构建一个技术生态圈,促进各种小程序应用在图书馆服务中的广泛应用。 云开发模式的具体技术优势可以从以下几个方面理解: 1. 减轻了对运维人员的依赖:传统的服务器运维需要专业的...

    微信小程序开发流程与技术探析.pdf

    微信小程序开发流程与技术探析.pdf

    “云开发”模式探析及其对图书馆微信小程序应用的影响.zip

    “云开发”模式是近年来信息技术领域的一个热点话题,它为各种应用程序,特别是移动应用,提供了新的开发和运行环境。在本文件中,我们将深入探讨“云开发”模式的原理、优势以及其对图书馆微信小程序应用的具体影响...

    探析JAVA编程语言在计算机软件开发中的应用.pdf

    标题和描述中提到的“JAVA编程语言在计算机软件开发中的应用”,我们可以从多个层面详细探讨该语言的关键特性及其在软件开发领域中的广泛应用和重要性。 首先,需要了解Java编程语言的基本概念。Java是一种高级、...

    浅谈微信小程序第三方开发及应用探析.zip

    (2)Taro:一个多端开发框架,支持微信、支付宝、百度等多平台的小程序开发。 (3)Wepy:基于Vue.js的微信小程序开发框架,让开发者可以使用Vue语法进行开发。 (4)uni-app:H5、微信小程序、支付宝小程序、百度...

    微信小程序应用探析.pdf

    轻型应用指的是那些无需下载安装、即搜即用、使用简便的应用,百度“轻应用”就是这样一个概念,其目的在于优化资源分配,减少用户和开发者的负担。尽管如此,轻型应用的探索并未取得成功,用户使用率较低,使得轻型...

    基于C语言嵌入式开发在智能手机中的应用探析.pdf

    "基于C语言嵌入式开发在智能手机中的应用探析" 本文探讨了基于C语言嵌入式开发在智能手机中的应用,讨论了C语言在嵌入式系统中的角色和优势,并对智能手机中的嵌入式开发进行了深入分析。 一、嵌入式系统概述 ...

    微信小程序在“互联网+农业”中的应用探析.pdf

    微信小程序在“互联网+农业”中的应用探析.pdf

    Java软件开发中文件操作的研究与探析.pdf

    文件操作是Java开发中最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件、声音文件,也经常根据需要从指定的文件中进行数据的读取。 Java语言使用File类对象表示文件和目录,通过File类对象...

    微信小程序开发流程与技术探析.zip

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出的,旨在提供便捷的、无需下载安装即可使用的应用体验。本篇文章将深入探讨微信小程序的开发流程和技术要点,帮助开发者快速掌握这一领域的...

    计算机软件开发中Java编程语言的运用探析.pdf

    Java编程语言由于其独特的优势和特性,在众多编程语言中脱颖而出,成为软件开发中广泛使用的工具之一。本文将深入探讨Java编程语言的实现原理、特点以及在软件开发中的应用。 Java编程语言作为一种高级编程语言,其...

    “C语言程序设计”教学中程序调试探析.pdf

    在探讨“C语言程序设计”教学过程中程序调试的问题时,本文将从多个层面解析程序调试的关键技巧和方法,帮助学生和程序设计初学者提升编程能力和程序调试水平。 一、程序调试的基本概念和重要性 程序调试是程序设计...

    高职嵌入式Linux驱动程序开发课程教学改革探析.pdf

    高职嵌入式Linux驱动程序开发课程教学改革探析.pdf

    学术期刊开发微信小程序的价值与策略探析.pdf

    学术期刊开发微信小程序的价值与策略探析.pdf

    JAVA中的JavaBeans技术探析.pdf

    JavaBeans技术是Java企业开发平台中一个重要的组件技术,用于建立分布式应用程序。JavaBeans技术的主要目标是提供一个标准的、可移植的、基于组件的企业级应用程序开发平台。该技术的设计目标是减少建立分布式应用...

Global site tag (gtag.js) - Google Analytics