globallock & globalunlock

首先我们介绍GlobalAlloc函数。

调用GlobalAlloc函数分配内存,该函数会返回分配到的内存的句柄

它返回的不是一个地址,而是一个句柄。

GlobalAlloc申请的内存有两种,一种是GAME_FIXED,一种是GAME_MOVABLE。两者的区别在于GAME_MOVABLE类型的内存是可移动的,比如此时堆里有好几块小内存,当再申请一块大内存时,操作系统会移动GAME_MOVABLE类型的内存以合并出来一块大内存。正因为GAME_MOVABLE是可移动的,所以要用句柄表示,不能用内存地址标识。对于GAME_FIXED类型的内存,该函数返回回来的句柄就是内存指针,可以直接当内存指针使用。

1
HGLOBAL hgl = GlobalAlloc(GAME_MOVABLE, 100 * sizeof(WCHAR));

在我们使用GlobalAlloc申请到一块GAME_MOVABLE内存之后,如果我们想往这块内存中写入数据,那就必须先锁定这块内存。内存锁定函数是GlobalLock,返回一个地址指针,接受一个内存句柄作为参数。在写内存完成后还是GlobalUnlock这块内存。

1
2
3
LPWSTR lpstrcpy = (LPWSTR)GlobalLock(hgl);
memcpy(lpstrcpy, ntext, 100 * sizeof(WCHAR));
GlobalUnlock(hgl);

Links:
GlobalAlloc、GlobalLock和GlobalUnLock详解