【转】浅析μC/GUI-v3.98之WM_H2P()句柄hWin转内存函数

浅析μC/GUI-v3.98之WM_H2P()句柄hWin转内存函数

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

#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("\n"__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
#define HMEM2PTR(hMem) (void*)&GUI_Heap.abHeap[aBlock[hMem].Off]//hWin句柄对应的内存起址GUI_Heap.abHeap+aBlock[hMem].Off

posted @ 2012-07-30 22:31  IT新秀  阅读(1397)  评论(0编辑  收藏  举报