GlobalReAlloc函数更改指定的全局内存对象的大小或属性。尺寸可以增减。
HGLOBAL GlobalReAlloc(
HGLOBAL 【HMEM】, | //处理全局内存对象 |
DWORD 【dwBytes】, | //块的新大小 |
UINT 【uFlags】 | //如何重新分配对象 |
); |
参数
【HMEM】
标识要重新分配的全局内存对象。该句柄由GlobalAlloc或GlobalReAlloc功能返回。
【dwBytes】
指定内存块的新大小(以字节为单位)。如果此参数为零,并且【uFlags】参数指定了GMEM_MOVEABLE标志,该函数将返回标记为已丢弃的内存对象的句柄。如果【uFlags】指定了GMEM_MODIFY标志,则此参数将被忽略。
【uFlags】
指定如何重新分配全局内存对象。如果指定了GMEM_MODIFY标志,则该参数将修改内存对象的属性,并忽略【dwBytes】参数。否则,此参数控制内存对象的重新分配。
GMEM_MODIFY标志可以与以下标志中的一个或两者相结合:
旗 | 含义 |
GMEM_DISCARDABLE | 如果还指定了GMEM_MODIFY标志,则分配可丢弃的内存。该标志被忽略,除非该对象先前被分配为可移动的,或者也指定了GMEM_MOVEABLE标志。 |
GMEM_MOVEABLE | 仅限Windows NT:如果还指定了GMEM_MODIFY标志,则将固定的内存对象更改为可移动内存对象。 |
如果此参数未指定GMEM_MODIFY,则可以是以下标志的任意组合:
旗 | 含义 |
GMEM_MOVEABLE | 如果【dwBytes】为零,则丢弃以前可移动和可废弃的内存块。如果对象的锁定计数不为零,或者块不可移动和可丢弃,则该函数失败。 如果【dwBytes】非零,则使系统能够将重新分配的块移动到新位置,而不会更改内存对象的可移动或固定属性。如果对象是固定的,返回的句柄可能与【HMEM】参数指定的句柄不同。如果对象是可移动的,即使对象当前被GlobalLock功能的先前调用锁定,也可以移动块而不使句柄无效。要获取内存块的新地址,请使用GlobalLock. |
GMEM_NOCOMPACT | 防止内存被压缩或丢弃以满足分配请求。 |
GMEM_ZEROINIT | 如果内存对象的大小不断增加,则会使额外的内存内容初始化为零。 |
返回值
如果函数成功,则返回值是重新分配的内存对象的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
如果GlobalReAlloc重新分配可移动对象,则返回值是内存对象的句柄。要将句柄转换为指针,请使用GlobalLock函数。
如果GlobalReAlloc重新分配固定对象,返回的句柄的值是内存块的第一个字节的地址。要访问内存,进程可以简单地将返回值转换为指针。
如果GlobalReAlloc失败,原始内存不会被释放,原来的句柄和指针仍然有效。
也可以看看