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:全局內存對象的句柄。這個句柄是通過GlobalAlloc或GlobalReAlloc來得到的
返回值:
調用成功,返回指向該對象的第一個字節的指針
調用失敗,返回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表示你已經把她玩厭了,釋放不釋放不關你的事,反正你對她沒興趣了。)
轉載于:https://www.cnblogs.com/jinxiang1224/p/8468402.html
總結
以上是生活随笔為你收集整理的GlobalAlloca GlobalLock GlobalUnlock函数的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android USB Gadget复合
- 下一篇: 数据结构-串操作应用之词索引表