图像处理——灰度直方图的建立中遇到的几个问题解析

来源:互联网 发布:源码后门 编辑:程序博客网 时间:2024/05/16 19:25

GlobalLock 函数的功能:

MSDN定义:

The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object's memory block.

Note  The global functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use theheap functions. However, the global functions are still used with DDE and the clipboard functions.

说明:锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效。Windows 为每个内存对象都维持着一个锁定计数。对这个函数的每次调用都应有一个对应的 GlobalUnlock 调用 返回值 Long,如成功,返回内存块的地址;如出错,或者这是一个已被丢弃的“可丢弃”内存块,则返回零。会设置GetLastError 参数表

为什么要使用GlobalLock 函数

GlobalAlloc申请的内存分两种,一种是GMEM_FIXED,另一种是GMEM_MOVEABLE。两者的差别只要在于GMEM_MOVEABLE类型的内存操作系统是可以移动的,比如堆中有好几块小内存,当再申请一大块内存时,操作系统会移动GMEM_MOVEABLE类型的内存来合并出一大块。正因为GMEM_MOVEABLE是可移动的,所以要用句柄标识,不能用内存地址标识,在使用时通过GlobalLock由句柄得到内存地址。

GlobalAlloc会从heap中分配所申请大小的一段内存,但是返回的只是一个这段内存的HANDLE,其他程序可能会在对内存进行操作的时候移动或者释放这段内存,为了防止这样的惨剧发生,可以调用GlobalLock将这段内存锁住,原理就是内存对象的内部数据结构有一个锁计数,这个有点像线程内核对象的UsageCount,只有当这个锁计数减为零时系统在需要时才会将这段内存移动或者释放掉(玩腻了,可以一脚踢开)。GlobalLock就是将锁计数加一,相反的,每次调用GlobalUnlock是将锁计数减一。简单点说GlobalAlloc表示你对这段内存有兴趣,不许释放掉;GlobalUnlock表示你已经把她玩厌了,释放不释放不关你的事,反正你对她没兴趣了

原创粉丝点击