#define WM_H2P(hWin)  ((WM_Obj*)GUI_ALLOC_h2p(hWin))       //锁定hWin句柄对应的内存空间

1.数据结构

//gui/core/GUIAlloc.c

#define GUI_ALLOC_SIZE 50000                               //自定义malloc的空间大小
#define GUI_MAXBLOCKS     (2 + GUI_ALLOC_SIZE / 32)        //目录索引总数(4字节对齐情况下)

typedef union {
  int aintHeap[GUI_ALLOC_SIZE /4];                         //4字节对齐
  U8 abHeap[GUI_ALLOC_SIZE];
} GUI_HEAP;

typedef struct {
  GUI_ALLOC_DATATYPE Off;                                  //内存偏移量
  GUI_ALLOC_DATATYPE Size;                                 //2007-07-09 gliethttp 
  HANDLE Next;                                             //各内存目录索引之间的双向链表
  HANDLE Prev;
} tBlock;
GUI_MEM_ALLOC GUI_HEAP GUI_Heap GUI_ALLOC_LOCATION;        //malloc申请的heap专用空间
static tBlock aBlock[GUI_MAXBLOCKS];

2.GUI_ALLOC_h2p()函数

//gui/core/GUIAlloc.c

void* GUI_ALLOC_h2p(GUI_HMEM hMem)
{
  GUI_ASSERT_LOCK();
  #if GUI_DEBUG_LEVEL > 0
    if (!hMem)
    {
      GUI_DEBUG_ERROROUT("
"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
      return 0;
    }
    if (aBlock[hMem].Size == 0)
    {
      GUI_DEBUG_ERROROUT("Dereferencing free block");
    }
  #endif
  return HMEM2PTR(hMem);                                   //返回hWin句柄对应的内存起址
}

3.HMEM2PTR()宏

//gui/core/GUIAlloc.c

//hWin句柄对应的内存起址GUI_Heap.abHeap+aBlock[hMem].Off
#define HMEM2PTR(hMem) (void*)&GUI_Heap.abHeap[aBlock[hMem].Off]

来源: http://gliethttp.cublog.cn