1

GetIconInfoの関数を使用して現在のカーソルのアイコン情報を取得するアプリケーションを作成しuser32.dllました。しばらくの間は正常に動作しますが、しばらくすると間違った情報ICONINFO.hbmMask(負の値) を提供し始め、次の行でから Bitmap オブジェクトを取得Bitmap.HBitmap(bitmask)すると、例外がスローされます。

A Generic error occured in GDI+.

そこから、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
4

2 に答える 2

1

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

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

これが問題である場合は、IDisposableについて読んで、オブジェクトの処理が完了した後にオブジェクトを呼び出すようDisposeにする必要があります (レンダリングされなくなります)。ビットマップとアイコン、およびほとんどの GDI+ オブジェクトは IDisposable を実装しています。

さらに、私には不明ですがDeleteObject、生の GDI オブジェクト自体を呼び出す必要がある場合があります (すべてハンドルを取得した場所によって異なります)。

于 2009-09-03T06:26:26.363 に答える
0

このPInvokeサンプルを確認してください。アンマネージ コードを介してプルしているオブジェクトを適切に削除していますか?

于 2009-09-03T06:16:01.833 に答える