【转】浅析μ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