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参数值。