Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22987
  • 博文数量: 14
  • 博客积分: 560
  • 博客等级: 中士
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-21 20:25
文章分类

全部博文(14)

文章存档

2010年(14)

我的朋友
最近访客

分类: C/C++

2010-10-16 09:44:41

调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。 
调用GlobalLock函数锁定内存块,该函数接受一个内存块对象句柄作为参数,然后返回一个指向被锁定的内存块的指针。 您可以用该指针来读写内存。
 
调用GlobalUnlock函数来解锁先前被锁定的内存,使得指向内存块的指针变为无效。

调用GlobalFree函数来释放指定的内存块对象。

 
 
(1) HGLOBAL GlobalAlloc( UINT uFlags , DWORD dwBytes );
// 分配一个全局内存块,返回内存块对象句柄。
参数:
uFlags
,指定欲分配的内存块的类型: 
             
GMEM_FIXED (0x00) 分配一个固定内存块。不能同GMEM_MOVEABLE一起使用

             GMEM_MOVEABLE    
分配一个可移动内存块。不能同GMEM_FIXED一起使用。若指定该标志,则要在进程中访问该内存块,必须调用GlobalLock来获得一个有效的虚拟内存指针。
             GMEM_ZEROINIT    
新分配的内存块全部初始化成零 
             GMEM_NOCOMPACT   堆在这个函数调用期间不进行累积 
             GMEM_NODISCARD   
函数调用期间不丢弃任何内存块
 
dwBytes
,要分配的字节数。

附注:
    若指定GMEM_FIXED,则返回值就是要使用的实际内存地址即指针(如果再调用GlobalLock会返回同样的值,所以在使用固定内存块的时候可不需要再执行GlobalLock/GlobalUnlock 操作)

(2) HGLOBAL GlobalReAlloc( HGLOBAL hMem , DWORD dwBytes, UINT uFlags );

参数:
hMem 先前申请的全局内存块对象句柄,为由GlobalAlloc GlobalReAlloc 函数的返回值。

dwBytes 指定新分配内存的字节数。

uFlags 是标志参数,可设为NULL。通过指定不同的uFlags来决定。是否允许Windows在必要的时候移动内存块,可以是下列选项之一或组合:

  GMEM_ZEROINIT   可以使内存块扩大的部分自动被初始化为0

  GMEM_MOVEABLE  如果需要移动内存块,Windows会在别的地方开辟一块新的内存,并把原来内存块中的内容自动复制到新的内存块中,这时函数的返回值是新的指针,原来的指针作废。

返回值:

       若分配成功,则返回新内存块对象句柄;

       若分配失败,则返回NULL

 

(3) DWORD GlobalSize( HGLOBAL hMem );

// 获得指定全局内存块的大小

参数:

hMem 先前申请的全局内存块对象句柄,为由GlobalAlloc GlobalReAlloc 函数的返回值。

返回值:

       若函数成功,则返回内存块的大小,字节单位;

       若指定的内存块对象句柄无效,则函数获取失败,返回0.

 

(4) HGLOBAL GlobalHandle( LPCVOID pMem );

// 由指向全局内存块的虚拟指针,获得该内存块的全局内存块对象句柄

返回值:

若函数成功,则返回一个有效的全局内存块对象句柄;

若函数失败,则返回NULL

 


LPVOID  GlobalLock( HGLOBAL  hMem );

// 锁定一个全局的内存对象,返回指向该对象的第一个字节的指针
参数
hMem
:全局内存对象的句柄。这个句柄是通过GlobalAllocGlobalReAlloc来得到的
返回值:
  
调用成功,返回指向该对象的第一个字节的指针
  
调用失败,返回NULL,可以用GetLastError来获得出错信息
注意:
  
调用过GlobalLock锁定一块内存区后,一定要调用GlobalUnlock来解锁。

 


BOOL GlobalUnlock( HGLOBAL hMem );
//
解除被锁定的全局内存对象
返回值:
  
若递减内存块的锁定计数后仍处于被锁定状态,则返回非0值;
  
若返回0,则表函数执行出错。可用GetLastError来获得出错信息,若错误码为NO_ERROR,则表示内存对象已经成功解锁了;若错误码为ERROR_NOT_LOCKED,则表示未加锁。
注意:    

这个函数实际上是将内存对象的锁定计数器减1,如果计数器不为0,则表示执行过多个GlobalLock函数来对这个内存对象加锁,需要对应数目的GlobalUnlock函数来解锁。

 

 

HGLOBAL GlobalFree( HGLOBAL hMem );

// 释放指定的内存块对象

参数:

hMem ,内存块对象句柄。为GlobalAlloc GlobalReAlloc 数的返回值。

返回值:

       若释放成功,则返回NULL

       若释放失败,则返回值等于hMem参数值。
阅读(732) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~