CreateCompatibleBitmap返回NULL,GetLastError却返回0

来源:互联网 发布:中国如何注册io域名 编辑:程序博客网 时间:2024/05/01 08:45


 memBM = CreateCompatibleBitmap(m_baseDC, bmp->width, bmp->height);    if ( memBM == NULL )    {        XExit(XEXIT_CODE_GDI, "CreateCompatibleBitmap(0x%x, %d, %d) fail: %d\n", m_baseDC, bmp->width, bmp->height, GetLastError());    }

今天发现了一个新问题,CreateCompatibleBitmap返回NULL,GetLastError却返回0。且用MessageBox弹出来的框中的字体也都变成黑体了,且窗口显示破碎。

原因:一开始以为是内存不足造成的,后来在任务管理器中看到此应用程序的GDI对象一列一直在上升,应用程序把GDI对象耗尽。


后来发现是因为没有把CreateRectRgn得到的HRGN释放掉造成的。

参考资料:VC资源分配、释放表 

http://zf0026.blog.163.com/blog/static/17826211320119264324359/

======================================================================
 Accelerators                 LoadAccelerators                 N/A                             No   
   Atoms                          GlobalAddAtom                    GlobalFreeAtom            Yes 
   Bitmaps                        CreateBitmap                       DeleteObject                 Yes *

                                CreateBitmapIndirect            DeleteObject                 Yes *
                                 CreateCompatibleBitmap       DeleteObject                 Yes *
                                 CreateDIBitmap                    DeleteObject                 Yes *
                                CreateDiscardableBitmap       DeleteObject                 Yes *
                                   LoadBitmap                         DeleteObject                 Yes Brushes                        CreateBrushIndirect              DeleteObject                 Yes
                                    CreateDIBPatternBrush         DeleteObject                 Yes
                                    CreateHatchBrush                 DeleteObject                 Yes
                                    CreatePatternBrush               DeleteObject                 Yes
                                    CreateSolidBrush                  DeleteObject                 Yes

Carets                          CreateCaret                          DestroyCaret                No #
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

Clipboard                      OpenClipboard                     CloseClipboard              Yes
  

Comms Ports               OpenComm                         CloseComm                  Yes
  

Cursor                         CreateCursor                       DestroyCursor                     Yes
                                           LoadCursor                         N/A                             No
  

DC                              CreateDC                                   DeleteDC                      Yes
                                          CreateCompatibleDC             DeleteDC                      Yes @
                                          GetDC                                ReleaseDC                    Yes
                                           GetWindowDC                     ReleaseDC                    Yes
                                           BeginPaint                           EndPaint                       Yes
  

DialogBox                     CreateDialog                        DestroyWindow            No
                                           CreateDialogIndirect             DestroyWindow            No
                                          CreateDialogIndirectParam    DestroyWindow            No
                                           CreateDialogParam               DestroyWindow            No
  

File                              OpenFile                              _lclose                         No
  

Fonts                           CreateFont                           DeleteObject                 Yes
                                           CreateFontIndirect                DeleteObject                 Yes
                                            AddFontResource                 RemoveFontResource    Yes
  

GDIStockObj               GetStockObject                    N/A                             No &
  

Hook                            SetWindowsHook                 UnhookWindowsHook   Yes
  

IC                                CreateIC                              DeleteDC                      Yes
  

Icon                             CreateIcon                           DestroyIcon                 Yes
                                           LoadIcon                             N/A                             No
  

Library                         LoadLibrary                         FreeLibrary                   Yes
  

Memory                       AllocDStoCSAlias                 FreeSelector                 Yes
                                            AllocSelector                       FreeSelector                 Yes
                                           GlobalAlloc                          GlobalFree                    No
                                           GlobalDOSAlloc                   GlobalDOSFr                No
                                          GlobalFix                      GlobalUnfix                  No
                                         GlobalLock                          GlobalUnlock                No
                                          GlobalPageLock                   GlobalPageUnlock         No
                                          GlobalRealloc                       GlobalFree                    No
                                          GlobalWire                           GlobalUnwire                No
                                          LocalAlloc                           LocalFree                     No
                                          LocalLock                           LocalUnlock                 No
                                          LocalRealloc                        LocalFree                     No
  

Menu                           CreateMenu                         DestroyMenu                No %
                                          CreatePopupMenu                DestroyMenu                No %
                                           LoadMenu                            DestroyMenu                No %
                                          LoadMenuIndirect                 DestroyMenu                No %
                                          GetSystemMenu                      N/A                             No
  

MetaFile                       CreateMetaFile                     DeleteMetaFile              Yes
  

Palette                          CreatePalette                        DeleteObject                 Yes
  

Pen                              CreatePen                            DeleteObject                 Yes
                                       CreatePenIndirect                     DeleteObject                 Yes
  


Regions                        CreateEllipticRgn                  DeleteObject                 Yes
                                              CreateEllipticRgnIndirect       DeleteObject                 Yes
                                              CreatePolygonRgn               DeleteObject                 Yes
                                            CreatePolyPolygonRgn          DeleteObject                 Yes
                                            CreateRectRgn                     DeleteObject                 Yes
                                            CreateRectRgnIndirect          DeleteObject                 Yes
                                           CreateRoundRectRgn            DeleteObject                 Yes
  

Resource                      AllocResource                      FreeResource                No
                                           FindResource                       N/A                             No
                                           LoadResource                      FreeResource                No
                                            LockResource                      UnlockResource            No

Sound                          OpenSound                          CloseSound                  Yes
  

String                           LoadString                           N/A                             No
  

Thunk                          MakeProcInstance                FreeProcInstance          No
  

Timer                           SetTimer                             KillTimer                      No
  

Window                       CreateWindow                     DestroyWindow            No
CreateWindowEx                  DestroyWindow            No

  

*     位图资源在释放的时候必须从选中它的DC中脱离。
%    当菜单失去焦点和窗口不再关联或者应用程序结束的时候占用资源必须被释放。
@    DC被释放前必须和它关联(选中)的位图取消联系
#     如果脱字符指定了位图,位图必须被释放
&    对DeleteObject的调用不会销毁常规的StockObject(系统内定资源)