218 lines
6 KiB
C++
218 lines
6 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: MemAPI.HXX
|
|
//
|
|
// Contents: Internal memory allocation routines
|
|
//
|
|
// Classes: CPrivAlloc
|
|
//
|
|
// Functions: PrivMemAlloc
|
|
// PrivMemAlloc8
|
|
// PrivMemFree
|
|
// UtGlobalxxx
|
|
//
|
|
// History:
|
|
// 25-Jan-94 alexgo added PubMemReAlloc
|
|
// 04-Nov-93 AlexT Created
|
|
//
|
|
// Notes:
|
|
//
|
|
// For memory that the application can free with the task IMalloc, use
|
|
// CoTaskMemAlloc and CoTaskMemFree.
|
|
//
|
|
// For process local memory that is used internally, use PrivMemAlloc and
|
|
// PrivMemFree.
|
|
//
|
|
// For process local class instances, use CPrivAlloc as a base class.
|
|
//
|
|
// PubMemAlloc, PubMemRealloc, and PubMemFree are obsolete.
|
|
//--------------------------------------------------------------------------
|
|
|
|
#ifndef __MEMAPI_HXX__
|
|
#define __MEMAPI_HXX__
|
|
|
|
//PubMemAlloc is obsolete. Use CoTaskMemAlloc.
|
|
#define PubMemAlloc(ulcb) CoTaskMemAlloc(ulcb)
|
|
|
|
//PubMemRealloc is obsolete. Use CoTaskMemRealloc.
|
|
#define PubMemRealloc(pv, ulcb) CoTaskMemRealloc(pv, ulcb)
|
|
|
|
//PubMemFree is obsolete. Use CoTaskMemFree.
|
|
#define PubMemFree(pv) CoTaskMemFree(pv)
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivMemAlloc
|
|
//
|
|
// Synopsis: Allocate private memory block
|
|
//
|
|
// Arguments: [ulcb] -- size of memory block
|
|
//
|
|
// Returns: Pointer to memory block
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
extern HANDLE g_hHeap;
|
|
|
|
typedef
|
|
LPVOID (WINAPI HEAP_ALLOC_ROUTINE)(
|
|
HANDLE hHeap,
|
|
DWORD dwFlags,
|
|
SIZE_T dwBytes);
|
|
|
|
extern HEAP_ALLOC_ROUTINE * pfnHeapAlloc;
|
|
|
|
// We might want to make this conditional on debug builds in ole32, but
|
|
// right now PrivMemAlloc goes straight to the heap because it's used in
|
|
// RPCSS.
|
|
//#define PrivMemAlloc(ulcb) CoTaskMemAlloc(ulcb)
|
|
#define PrivMemAlloc(ulcb) (*pfnHeapAlloc)(g_hHeap, 0, (ulcb))
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivMemAlloc8
|
|
//
|
|
// Synopsis: Allocate private memory block aligned on 8 byte boundary
|
|
//
|
|
// Arguments: [ulcb] -- size of memory block
|
|
//
|
|
// Returns: Pointer to memory block
|
|
//
|
|
// History: 14 Jul 94 AlexMit Created
|
|
//
|
|
// Notes: The allocator already aligns on 8byte boundary, but this method
|
|
// remains to document the code that depends on this alignment.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
#define PrivMemAlloc8(ulcb) PrivMemAlloc(((ulcb)+7)&~7)
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivMemFree
|
|
//
|
|
// Synopsis: Frees private memory block
|
|
//
|
|
// Arguments: [pv] -- pointer to memory block
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
typedef
|
|
BOOL (WINAPI HEAP_FREE_ROUTINE)(
|
|
HANDLE hHeap,
|
|
DWORD dwFlags,
|
|
LPVOID lpMem);
|
|
|
|
extern HEAP_FREE_ROUTINE *pfnHeapFree;
|
|
|
|
//#define PrivMemFree(pv) CoTaskMemFree(pv)
|
|
#define PrivMemFree(pv) (*pfnHeapFree)(g_hHeap, 0, (pv))
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivMemFree8
|
|
//
|
|
// Synopsis: Free private memory block aligned on 8 byte boundary
|
|
//
|
|
// Arguments: [pv] -- pointer to memory block
|
|
//
|
|
// Returns: none
|
|
//
|
|
// History: 23 May 95 MurthyS Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
#define PrivMemFree8 PrivMemFree
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CPrivAlloc
|
|
//
|
|
// Purpose: Base class for process local classes
|
|
//
|
|
// Interface: operator new
|
|
// operator delete
|
|
//
|
|
// History: 04-Nov-93 AlexT Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
class CPrivAlloc
|
|
{
|
|
public:
|
|
void *operator new(size_t size)
|
|
{
|
|
return PrivMemAlloc(size);
|
|
};
|
|
|
|
void operator delete(void *pv)
|
|
{
|
|
PrivMemFree(pv);
|
|
};
|
|
};
|
|
|
|
void FAR* __cdecl operator new(size_t size);
|
|
void __cdecl operator delete(void FAR* ptr);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtGlobalxxx
|
|
//
|
|
// Synopsis: Debugging version of global memory functions
|
|
//
|
|
// History: 28-Feb-94 AlexT Created
|
|
// 10-May-94 KevinRo Disabled for DDE build
|
|
//
|
|
// Notes:
|
|
//
|
|
// DDE uses GlobalAlloc for exchanging data between 16 and 32 bit
|
|
// servers, as well as for passing data across to other processes.
|
|
// The routine GlobalSize() is used quite often in these routines to
|
|
// determine the amount of data in the block. Therefore, we shouldn't go
|
|
// adding extra data to the block, like these routines do. Therefore,
|
|
// we won't override these routines if OLE_DDE_NO_GLOBAL_TRACKING is defined
|
|
//
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#if DBG==1 && defined(WIN32) && !defined(OLE_DDE_NO_GLOBAL_TRACKING)
|
|
|
|
#define GlobalAlloc(uiFlag, cbBytes) UtGlobalAlloc(uiFlag, cbBytes)
|
|
#define GlobalReAlloc(h, cb, uiFlag) UtGlobalReAlloc(h, cb, uiFlag)
|
|
#define GlobalLock(h) UtGlobalLock(h)
|
|
#define GlobalUnlock(h) UtGlobalUnlock(h)
|
|
#define GlobalFree(h) UtGlobalFree(h)
|
|
#define SetClipboardData(uFormat, hMem) UtSetClipboardData(uFormat, hMem)
|
|
|
|
extern "C" HGLOBAL WINAPI UtGlobalAlloc(UINT uiFlag, SIZE_T cbUser);
|
|
extern "C" HGLOBAL WINAPI UtGlobalReAlloc(HGLOBAL hGlobal, SIZE_T cbUser, UINT uiFlag);
|
|
extern "C" LPVOID WINAPI UtGlobalLock(HGLOBAL hGlobal);
|
|
extern "C" BOOL WINAPI UtGlobalUnlock(HGLOBAL hGlobal);
|
|
extern "C" HGLOBAL WINAPI UtGlobalFree(HGLOBAL hGlobal);
|
|
extern "C" HANDLE WINAPI UtSetClipboardData(UINT uFormat, HANDLE hMem);
|
|
|
|
extern "C" void UtGlobalFlushTracking(void);
|
|
|
|
#else
|
|
|
|
#define UtGlobalFlushTracking() NULL
|
|
#define UtGlobalStopTracking(hGlobal) NULL
|
|
|
|
#endif // !(DBG==1 && defined(WIN32))
|
|
|
|
#endif // !defined(__MEMAPI_HXX__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|