2009-09-03 119 views
1

我写这是越来越使用user32.dllGetIconInfo功能当前光标的图标信息的应用程序,它正常工作了一段时间,但一段时间后,它开始在ICONINFO.hbmMask(一些负值提供错误信息),并在下一行我尝试从Bitmap.HBitmap(bitmask)得到位图对象,它抛出一个异常:的GetIconInfo功能不能正常工作

A Generic error occured in GDI+. 

从那里onwords,它不断地给这个例外,因为GetIconInfo总是返回负值(所有这些代码是工作在一个循环)..

任何人都可以告诉我这是什么问题吗?以及如何避免下一次迭代异常?

下面是代码

 while (true) 
     { 
    //DLLimport User32.dll 
      PlatformInvokeUSER32.ICONINFO temp; 

    //Get the current cursor 
    IntPtr curInfo = GetCurrentCursor(); 


      Cursor cur; 
      Icon ic; 

      if (curInfo != null && curInfo.ToInt32() != 0 && isOSelected) 
      { 

       cur = CheckForCusrors(curInfo); 

       try 
       { 
     //Dllimport User32.dll 
     //after some time the temp.hbmMask begin to get -ive vlaue from following function call 
        PlatformInvokeUSER32.GetIconInfo(curInfo, out temp); 

        if (temp.hbmMask != IntPtr.Zero) 
        { 

      //due to negative value of hbmMask the following function generates an exception 
          Bitmap bitmask = Bitmap.FromHbitmap(temp.hbmMask); 

      ic = Icon.FromHandle(curInfo); 

          Bitmap bmpCur = ic.ToBitmap(); 

        } 
      } 
       catch (Exception ee) 
       { 
        //Exception message is 
     //A Generic error occured in GDI+ 
     //and this loop begins to throw exception continuously 
       } 
      } 


     }// while ended 
+1

尝试发布一些代码。 – 2009-09-03 05:54:17

+0

也许这篇文章有帮助:[调试GDI资源泄漏](https://blogs.msdn.microsoft.com/oldnewthing/20170519-00/?p=96195) – coz 2017-05-24 04:39:39

回答

0

看看这个PInvoke样,你是正确删除您是通过非托管代码拉动的对象?

1

你的循环有多大? GDI +资源是操作系统资源,可用性受到限制。

如果这是您的问题,您可以通过监控您的流程分配的HANDLE来找出。如果GDI +在特定句柄计数(HBITMAP或HICON)达到限制时开始抱怨,那么您知道必须更加智能地处理资源。你可以先使用任务管理器来做到这一点,但可能想切换到更复杂的软件,如Process Explorer

如果这是您的问题,那么您需要阅读有关IDisposable,并确保您在对象完成后调用Dispose(不再呈现)。位图和图标以及大多数GDI +对象实现IDisposable。此外,我还不清楚,但是您可能需要在某些原始GDI对象本身上调用DeleteObject(全部取决于您获得手柄的位置)。

+0

我需要连续捕获图标,它工作正常一段时间,然后它开始给这个例外,永远不会回来.. – 2009-09-03 06:30:46

+0

那么问题是,你在哪里释放资源?我的最初陈述是,你的资源有限。即使您持续加载它们,机器也没有无限的资源。 – 2009-09-03 06:54:55

+0

谢谢弗兰克,但你可以请给我一些代码示例告诉我如何释放资源,我可以使用DeleteObject gdi32.dll ...我在C#环境.. – 2009-09-03 07:01:13