文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>GlobalAlloc、GlobalReAlloc、GlobalLock、Globa..

GlobalAlloc、GlobalReAlloc、GlobalLock、Globa..

时间:2010-10-16  来源:houbangen

调用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:全局内存对象的句柄。这个句柄是通过GlobalAlloc或GlobalReAlloc来得到的
返回值:
   调用成功,返回指向该对象的第一个字节的指针
   调用失败,返回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参数值。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载