Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15498778
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: C/C++

2007-07-09 17:02:48

 

浅析μ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

阅读(4339) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~