zoukankan      html  css  js  c++  java
  • 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表示你已经把她玩厌了,释放不释放不关你的事,反正你对她没兴趣了。)

  • 相关阅读:
    JMeter发送get请求并分析返回结果
    在Linux CentOS上搭建Jmeter压测环境
    Jmeter对数据库批量增删改查
    adb下载安装
    JMeter循环读取CSV文件实现接口批量测试
    Jmeter接口测试-MD5加密-请求验签(完整流程)
    fiddler 手机抓包(含https) 完整流程
    火狐兼容selenium版本解决
    selenium启动IE失败,并报错:Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones
    基于pywinauto的Windows平台上自动化测试实践(2)
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468402.html
Copyright © 2011-2022 走看看