windows-nt/Source/XPSP1/NT/com/ole32/ih/memapi.hxx
2020-09-26 16:20:57 +08:00

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__)