You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.5 KiB
112 lines
2.5 KiB
// Copyright (c) 1997-1999 Microsoft Corporation
|
|
//
|
|
// memory management stuff
|
|
//
|
|
// 22-Nov-1999 sburns (refactored)
|
|
|
|
|
|
|
|
#include "headers.hxx"
|
|
|
|
|
|
//
|
|
// Debug and Retail build
|
|
//
|
|
|
|
|
|
|
|
static const int RES_STRING_SIZE = 512;
|
|
static TCHAR LOW_MEMORY_MESSAGE[RES_STRING_SIZE];
|
|
static TCHAR LOW_MEMORY_TITLE[RES_STRING_SIZE];
|
|
|
|
// we declare a static instance of bad_alloc so that the loader allocates
|
|
// space for it. Otherwise, we'd have to allocate an instance during failure
|
|
// of operator new, which we obviously can't do, since we're out-of-memory at
|
|
// that point.
|
|
|
|
static const std::bad_alloc nomem;
|
|
|
|
|
|
|
|
// Called when OperatorNew cannot satisfy an allocation request.
|
|
//
|
|
// Brings up a dialog to inform the user to free up some memory then retry the
|
|
// allocation, or cancel. The dialog can appear in low-memory conditions.
|
|
//
|
|
// Returns IDRETRY if the allocation should be re-attempted, IDCANCEL
|
|
// otherwise. Returns IDCANCEL if the module resource handle has not been
|
|
// set (see burnslib.hpp).
|
|
|
|
int
|
|
DoLowMemoryDialog()
|
|
{
|
|
static bool initialized = false;
|
|
|
|
if (!initialized)
|
|
{
|
|
HINSTANCE hinstance = GetResourceModuleHandle();
|
|
if (!hinstance)
|
|
{
|
|
// DLL/WinMain has not set the handle. So just throw.
|
|
|
|
return IDCANCEL;
|
|
}
|
|
|
|
// This will work, even in low memory, as it just returns a pointer
|
|
// to the string in the exe image.
|
|
|
|
int result1 =
|
|
|
|
// REVIEWED-2002/03/06-sburns correct character count passed
|
|
|
|
::LoadString(
|
|
hinstance,
|
|
IDS_LOW_MEMORY_MESSAGE,
|
|
LOW_MEMORY_MESSAGE,
|
|
RES_STRING_SIZE);
|
|
|
|
int result2 =
|
|
|
|
// REVIEWED-2002/03/06-sburns correct character count passed
|
|
|
|
::LoadString(
|
|
hinstance,
|
|
IDS_LOW_MEMORY_TITLE,
|
|
LOW_MEMORY_TITLE,
|
|
RES_STRING_SIZE);
|
|
if (result1 && result2)
|
|
{
|
|
initialized = true;
|
|
}
|
|
}
|
|
|
|
return
|
|
::MessageBox(
|
|
::GetDesktopWindow(),
|
|
LOW_MEMORY_MESSAGE,
|
|
LOW_MEMORY_TITLE,
|
|
|
|
// ICONHAND + SYSTEMMODAL gets us the special low-memory
|
|
// message box.
|
|
|
|
MB_RETRYCANCEL | MB_ICONHAND | MB_SYSTEMMODAL);
|
|
}
|
|
|
|
|
|
|
|
// Include the code for the debug or retail variations of the replacement
|
|
// operator new and delete
|
|
|
|
#ifdef DBG
|
|
|
|
// debug code
|
|
|
|
#include "heapdbg.cpp"
|
|
|
|
#else
|
|
|
|
// retail code
|
|
|
|
#include "heapretl.cpp"
|
|
|
|
#endif
|