home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_03_06 / 3n06020a < prev    next >
Text File  |  1992-03-20  |  2KB  |  66 lines

  1. #include <windows.h>
  2.  
  3. LPVOID FAR PASCAL AllocMem(DWORD bytes);
  4.  
  5. CATCHBUF CatchBuf; /* catch environment buffer */
  6.  
  7. int PASCAL WinMain(HANDLE hInstance,
  8.    HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  9. {
  10.    /* set initial block size to a value too large */
  11.    DWORD dwBlockSize = 100000000L;
  12.    LPWORD lpWord;
  13.  
  14.    /* set up catch buffer; the Throw from AllocMem */
  15.    /* will result in a non-zero return from Catch below */
  16.    for (;;)
  17.    {
  18.       if (Catch((LPCATCHBUF)CatchBuf) == 0)
  19.          break;
  20.  
  21.       /* this code is executed when AllocMem fails */
  22.       if (dwBlockSize == 0)
  23.          /* memory is totally exhausted */
  24.          return 0;
  25.       else
  26.          /* adjust block size after allocation fails */
  27.          dwBlockSize /= 10;
  28.    }
  29.  
  30.    lpWord = (LPWORD)AllocMem(dwBlockSize);
  31.  
  32.    /* the following dereference is always valid, since */
  33.    /* AllocMem never returns NULL. */
  34.    return *lpWord;
  35. }
  36.  
  37. /* Wrapper for GlobalAlloc that handles out-of-memory */
  38. /* condition: this function never returns NULL. */
  39. LPVOID FAR PASCAL AllocMem(DWORD bytes)
  40. {
  41.    HANDLE hMem = NULL;
  42.    LPVOID lpResult;
  43.  
  44.    while (!(hMem = GlobalAlloc(GMEM_MOVEABLE, bytes)))
  45.       if (GlobalCompact(bytes) < bytes)
  46.          if (MessageBox(GetFocus(), "Out of memory.  "\
  47.               "Close one or more applications, then "\
  48.               "select Retry, or select Cancel to exit.",
  49.               NULL, MB_RETRYCANCEL | MB_ICONHAND)
  50.                      != IDRETRY)
  51.             /* throw back to top-level (cancel) */
  52.             Throw((LPCATCHBUF)CatchBuf, 1);
  53.  
  54.    lpResult = GlobalLock(hMem);
  55.  
  56.    if (!lpResult)
  57.    {
  58.       GlobalFree(hMem);
  59.  
  60.       /* throw back to top-level (cancel) */
  61.       Throw((LPCATCHBUF)CatchBuf, 1);
  62.    }
  63.  
  64.    return lpResult;
  65. }
  66.