2009-09-03 5 views
1

user32.dll의 기능을 사용하여 현재 커서의 아이콘 정보를 얻는 응용 프로그램을 작성했습니다. 일부 시간은 정상적으로 작동하지만 얼마 후에는 잘못된 정보를 제공하기 시작합니다. ICONINFO.hbmMask (일부 음수 값 내가 Bitmap.HBitmap(bitmask)에서 비트 맵 객체를 얻으려고 다음 줄에, 그것은 예외가 발생하는 경우), 그리고 :이 onwords에서GetIconInfo 함수가 제대로 작동하지 않습니다.

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 
+1

일부 코드를 게시 해보세요. –

+0

어쩌면이 도움말은 도움이됩니다. [GDI 리소스 누수 디버깅] (https://blogs.msdn.microsoft.com/oldnewthing/20170519-00/?p=96195) – coz

답변

0

체크 아웃이 PInvoke 샘플을, 당신은 제대로 관리되지 않는 코드를 통해 당기는 개체를 삭제하는?

1

루프가 얼마나 큽니까? GDI + 리소스는 OS 리소스이며 가용성이 제한적입니다.

프로세스에 의해 할당 된 핸들을 모니터링하여 문제가있는 경우 을 찾을 수 있습니다. GDI +가 특정 핸들 수 (HBITMAP 또는 HICON)가 한계에 도달하면 불평하기 시작하면 리소스를보다 지능적으로 처리해야한다는 것을 알게됩니다. 작업 관리자를 사용하여 시작할 수 있지만 Process Explorer과 같은보다 정교한 소프트웨어로 전환 할 수 있습니다.

이 문제가 발생하면 약 IDisposable에 대해 읽어야하며 완료되면 개체에 Dispose을 호출해야합니다 (더 이상 렌더링되지 않음). 비트 맵과 아이콘 및 대부분의 GDI + 개체는 IDisposable을 구현합니다.

또한 나에게 불분명하지만 일부 원시 GDI 개체 (모두 핸들이있는 위치에 따라 다름)에 DeleteObject을 호출해야 할 수도 있습니다.

+0

아이콘을 지속적으로 캡처해야합니다. 언젠가는이 예외를주기 시작했고 다시는 돌아 오지 않습니다. –

+0

질문은 다음과 같습니다. 나의 초기 진술서는 제한된 자원을 가지고있다. 연속적으로로드하더라도 기계에는 무제한의 자원이 없습니다. –

+0

감사합니다. 프랭크,하지만 리소스를 해제하는 방법을 알려주는 코드 샘플을 보내 주시겠습니까? DeleteObject를 gdi32.dll에서 사용할 수 있습니까? 저는 C# 환경에 있습니다. –

관련 문제