2009-09-03 12 views
1

GetIconInfoの機能を使用して現在のカーソルのアイコン情報を取得しているアプリケーションを作成しました。しばらくの間うまく動作しますが、しばらくしてからICONINFO.hbmMask(負の値)、と私はBitmap.HBitmap(bitmask)からBitmapオブジェクトを取得しようと次の行に、それは例外スローした場合:GetIconInfoは常にこのすべてのコードがある(負の値を返すようそこからGetIconInfo関数が正常に動作しません

A Generic error occured in GDI+. 

はonwords、それが継続的に、この例外を与えますループで作業中)..

誰でもこの問題が何であるか教えていただけますか?次の反復例外を回避する方法は?ここで

コードが

ある
 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

コードを投稿してみてください。 –

+0

多分この資料は役立ちます:[GDIリソースリークのデバッグ](https://blogs.msdn.microsoft.com/oldnewthing/20170519-00/?p=96195) – coz

答えて

0

このPInvokeサンプルをチェックアウト、あなたが適切にあなたがアンマネージコードを介して引いているオブジェクトを削除していますか?

1

ループの大きさはどれくらいですか? GDI +リソースはOSリソースであり、可用性に限りがあります。

が問題の場合は、がプロセスによって割り当てられたハンドルを監視することによってわかります。特定のハンドルカウント(HBITMAPまたはHICON)が限界に達したときにGDI +がエラーを発すると、よりインテリジェントにリソースを処理する必要があることがわかります。タスクマネージャを使用して起動することはできますが、Process Explorerのようなより洗練されたソフトウェアに切り替えることができます。

これが問題であれば、約IDisposableを読んで、完了したらオブジェクトにDisposeを呼び出してください(もうレンダリングされません)。ビットマップとアイコンとほとんどのGDI +オブジェクトはIDisposableを実装します。

さらに、私には不明ですが、生のGDIオブジェクト自体の一部でDeleteObjectを呼び出す必要があるかもしれません(ハンドルはどこにあるかによって異なります)。

+0

アイコンを連続的にキャプチャする必要があります。しばらくしてからこの例外を出し始めて、戻ってくることはありません。 –

+0

質問はどこにありますか?私の最初の陳述は、限られたリソースしか持っていないということです。たとえそれらを連続してロードしても、マシンには無限のリソースがありません。 –

+0

ありがとうございます。しかし、リソースを解放する方法を教えてくれるコードサンプルを送ってもらえますか?gdi32.dllからDeleteObjectを使うことはできますか...私はC#enviornment ..# –

関連する問題