• GlobalAlloca GlobalLock GlobalUnlock函数的作用


    调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。 
    调用GlobalLock函数锁定内存块,该函数接受一个内存句柄作为参数,然后返回一个指向被锁定的内存块的指针。 您可以用该指针来读写内存。 
    调用GlobalUnlock函数来解锁先前被锁定的内存,该函数使得指向内存块的指针无效。 
    调用GlobalFree函数来释放内存块。您必须传给该函数一个内存句柄。

    GlobalAlloc

    函数原型
    GlobalAlloc(UINT uFLAG,DWORD dwBytes);
    说明 
    分配一个全局内存块 
    返回值 
    Long
    ,返回全局内存句柄。零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    uFlags Long
    ,对分配的内存类型进行定义的常数标志,如下所示: 
                  GMEM_FIXED 
    分配一个固定内存块 
                  GMEM_MOVEABLE 
    分配一个可移动内存块 
                  GMEM_DISCARDABLE 
    分配一个可丢弃内存块 
                  GMEM_NOCOMPACT 
    堆在这个函数调用期间不进行累积 
                  GMEM_NODISCARD 
    函数调用期间不丢弃任何内存块 
                  GMEM_ZEROINIT 
    新分配的内存块全部初始化成零 
    dwBytes Long
    ,要分配的字符数 
    注解 
    如指定了 GMEM_FIXED,那么返回值就是要使用的实际内存地址即指针(GlobalLock 会返回同样的值)——所以在使用固定内存块的时候不需要执行一个 GlobalLock/GlobalUnlock 操作
    由于 Win32 采用了高级的内存管理方案,所以使用可移动的内存块并没有什么好处
    用这个函数分配的内存块允许在8位边界以内

    GlobalLock  
    函数功能描述:锁定一个全局的内存对象,返回指向该对象的第一个字节的指针
    函数原型
    LPVOID GlobalLock( HGLOBAL hMem )
    参数
    hMem
    :全局内存对象的句柄。这个句柄是通过GlobalAllocGlobalReAlloc来得到的
    返回值:
    调用成功,返回指向该对象的第一个字节的指针
    调用失败,返回NULL,可以用GetLastError来获得出错信息
    注意:
    调用过GlobalLock锁定一块内存区后,一定要调用GlobalUnlock来解锁。

    GlobalUnlock
    函数功能描述:
    解除被锁定的全局内存对象
    函数原型:BOOL GlobalUnlock( HGLOBAL hMem );
    参数:hMem:全局内存对象的句柄
    返回值:
    非零值,指定的内存对象仍处于被锁定状态
    0
    ,函数执行出错,可以用GetLastError来获得出错信息,如果返回NO_ERROR,则表示内存对象已经解锁了
    注意:     这个函数实际上是将内存对象的锁定计数器减一,如果计数器不为0,则表示执行过多个GlobalLock函数来对这个内存对象加锁,需要对应数目的GlobalUnlock函数来解锁。
    如果通过GetLastError函数返回错误码为ERROR_NOT_LOCKED,则表示未加锁或已经解锁。

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

  • 相关阅读:
    Conventional and Direct Path Loads
    [转]Oracle DB RMAN 简单配置
    [转]Oracle DB 使用快速恢复区
    增量备份,11g052题目解析
    [转]Oracle DB 使用RMAN执行恢复
    [转]Oracle DB 备份和恢复的概念
    [转]Oracle DB 管理数据并发处理
    [转]Oracle DB管理内存
    [转]Oracle 并行原理与示例总结
    [转]Oracle DB审计
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468402.html
Copyright © 2020-2023  润新知