[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 612
  • Last Modified:

GlobalFree crash

Once every few days my app crashes inside GlobalFree.

Before I call the function, I check that the memory is OK by IsBadWritePtr.
Is there a way to make sure that it will not crash?
Or is there a way like try{}catch() that will avoid the crash.

Thanks,
Shlomo;
0
VapiSoft
Asked:
VapiSoft
  • 9
  • 8
1 Solution
 
jkrCommented:
What kind of crash do you get? If it is a SEH exception, try

LONG ExceptionFilter(DWORD dwCause) {

printf("Found a SEH exception 0x%8.8x\n",dwCause);

return 1;
}

__try {

  // 'GlobalFree()'  here

} __except(ExceptionFilter(GetExceptionCode()) {

  // handle here
}
0
 
VapiSoftAuthor Commented:
I already have

try
{
 GlobalFree(hDIB);
}
catch(...)
{
}

What is the difference between try and __try ?
0
 
jkrCommented:
>>What is the difference between try and __try ?

'try' will catch ++ exceptions, but *no* SEH exceptions (unless you provide a translator, see http://msdn.microsoft.com/library/en-us/vclib/html/_CRT__set_se_translator.asp) - this applies to access violations also, whereas '__try' will only catch SEH exceptions. They simply belong to two absolutely different exception handling concepts.
0
Take Control of Web Hosting For Your Clients

As a web developer or IT admin, successfully managing multiple client accounts can be challenging. In this webinar we will look at the tools provided by Media Temple and Plesk to make managing your clients’ hosting easier.

 
VapiSoftAuthor Commented:
Thank you very much.
I will try it.
0
 
VapiSoftAuthor Commented:
I tried it, it doesn't work.
I load it with a debugger, and I changed the hDIB handle.
I expected the __except to catch the "crash", it did not.
0
 
jkrCommented:
>>I expected the __except to catch the "crash", it did not.

Wrong assumption. It is not to catch the exception, but to detect the cause. That's the interesting part.
0
 
VapiSoftAuthor Commented:
I tried again, it does not get to the ExceptionFilter(DWORD dwCause) either.
Maybe because it is under the debugger?
0
 
jkrCommented:
Could you post the exact code how you're trying that?
0
 
VapiSoftAuthor Commented:
Opps.
Now I did receive it, and it even helped me not to crash (it did get to the exception handler part).
So first, thank you very much.
Also, the dwCause was 5, what is 5?
0
 
jkrCommented:
That's odd, there is no such exception code....
0
 
VapiSoftAuthor Commented:
Opps, the error code is 0xc0000005
0
 
jkrCommented:
Well, that's a plain EXCEPTION_ACCESS_VIOLATION.
0
 
VapiSoftAuthor Commented:
What does it mean in relation to GlobalFree(hDIB)?
Does it mean that it is already free?
 
0
 
jkrCommented:
Good question. How are you allocating that memory?
0
 
VapiSoftAuthor Commented:
First I do GlobalAlloc, and then GlobalReAlloc
0
 
jkrCommented:
Can you post the code where you create 'hDIB'?
0
 
VapiSoftAuthor Commented:
HANDLE getPictureHandle(HBITMAP hBitmap, HDC hdc, int &nLines, int &nColumns, LPBYTE &start)
{
 BITMAPINFOHEADER bih;
 //HPALETTE hPal;
 BITMAP Bitmap;
 //HDC hDC;

      HANDLE               hMem;
 WORD                 biBits;
      LPBITMAPINFOHEADER   lpbih;

      GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
      
 int w2=Bitmap.bmWidth;
 int h2=Bitmap.bmHeight;

      biBits = n_pixels; // Bitmap.bmPlanes * Bitmap.bmBitsPixel;
      
      bih.biSize            = sizeof(BITMAPINFOHEADER);
      bih.biWidth           = w2;
      bih.biHeight          = h2;
      bih.biPlanes          = Bitmap.bmPlanes;
      bih.biBitCount        = n_pixels; // 32; // Bitmap.bmBitsPixel;
      bih.biCompression     = 0;
      bih.biSizeImage       = 0;
      bih.biXPelsPerMeter   = 3780;
      bih.biYPelsPerMeter   = 3780;
      bih.biClrUsed         = 0;
      bih.biClrImportant    = 0;
      bih.biSizeImage=0;

      int dwLen  = bih.biSize + ColorTableSize(&bih);

      HANDLE hDIB = GlobalAlloc(GPTR, dwLen);
      
      if (!hDIB)
 {
            return 0;
      }
      
      lpbih = (LPBITMAPINFOHEADER)hDIB;
      
      *lpbih = bih;
      
 /// get the actual size
      nLines=GetDIBits(hdc,
            hBitmap,
            (UINT)0,
            (UINT)bih.biHeight,
  (LPVOID)NULL,
            (LPBITMAPINFO)lpbih,
            DIB_RGB_COLORS);

      bih = *lpbih;
      
      if (bih.biSizeImage == 0)
 {
            if(hDIB)
            {
                  GlobalFreeDIB(hDIB,5);
            }
            return 0;
      }
      
      dwLen = bih.biSize + ColorTableSize(&bih) + bih.biSizeImage;
      hMem = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE|GMEM_ZEROINIT);
 if (!hMem) return 0;
 
      hDIB = hMem;
      //printDebugLog("GlobalReAlloc: hDIB=%x",hDIB);

 lpbih = (LPBITMAPINFOHEADER)hDIB;
 int color_table_size=ColorTableSize(lpbih);
 start=(LPBYTE)lpbih + (WORD)lpbih->biSize + color_table_size;
 nColumns=bih.biWidth;

      DWORD t1=GetTickCount();

 nLines=GetDIBits(hdc,
              hBitmap,
              (UINT)0,
              (UINT)bih.biHeight,
    start,
              (LPBITMAPINFO)lpbih,
              DIB_RGB_COLORS);
 

      //CreateDIBSection(hdc,(LPBITMAPINFO) &lpbih,DIB_RGB_COLORS,(void **) &start,0,0);
 //memcpy(start,start1,bih.biSizeImage);

 DWORD t2=GetTickCount();
      //DeleteObject(hbmp);
      printDebugLog("GetDIBits: dt=%d",t2-t1);

 return hDIB;
}

 

HDC hdc=GetWindowDC(hwnd);
 HDC memDC   =CreateCompatibleDC(hdc);
 HBITMAP hbmp=CreateCompatibleBitmap(hdc, wr.cx, wr.cy);
      DWORD t3=GetTickCount();
 HBITMAP oldBmp=(HBITMAP) SelectObject(memDC,hbmp);
 BitBlt(memDC,0,0, wr.cx, wr.cy, hdc, x_offset, y_offset, SRCCOPY);
 //oldBmp=(HBITMAP) SelectObject(memDC,hbmp);
      DWORD t4=GetTickCount();

 msg->hDIB=getPictureHandle(hbmp,hdc,wr.cy,wr.cx,msg->pixels);

 SelectObject(memDC,oldBmp);
 DeleteObject(hbmp);
 DeleteObject(memDC);
 ReleaseDC(hwnd, hdc);

0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 9
  • 8
Tackle projects and never again get stuck behind a technical roadblock.
Join Now