GlobalAlloca GlobalLock GlobalUnlock函数的作用
調(diào)用GlobalAlloc函數(shù)分配一塊內(nèi)存,該函數(shù)會返回分配的內(nèi)存句柄。?
調(diào)用GlobalLock函數(shù)鎖定內(nèi)存塊,該函數(shù)接受一個內(nèi)存句柄作為參數(shù),然后返回一個指向被鎖定的內(nèi)存塊的指針。 您可以用該指針來讀寫內(nèi)存。?
調(diào)用GlobalUnlock函數(shù)來解鎖先前被鎖定的內(nèi)存,該函數(shù)使得指向內(nèi)存塊的指針無效。?
調(diào)用GlobalFree函數(shù)來釋放內(nèi)存塊。您必須傳給該函數(shù)一個內(nèi)存句柄。
GlobalAlloc
函數(shù)原型:
GlobalAlloc(UINT uFLAG,DWORD dwBytes);
說明?
分配一個全局內(nèi)存塊?
返回值?
Long,返回全局內(nèi)存句柄。零表示失敗。會設置GetLastError?
參數(shù)表?
參數(shù) 類型及說明?
uFlags Long,對分配的內(nèi)存類型進行定義的常數(shù)標志,如下所示:?
????????????? GMEM_FIXED?分配一個固定內(nèi)存塊?
????????????? GMEM_MOVEABLE?分配一個可移動內(nèi)存塊?
????????????? GMEM_DISCARDABLE?分配一個可丟棄內(nèi)存塊?
????????????? GMEM_NOCOMPACT?堆在這個函數(shù)調(diào)用期間不進行累積?
????????????? GMEM_NODISCARD?函數(shù)調(diào)用期間不丟棄任何內(nèi)存塊?
????????????? GMEM_ZEROINIT?新分配的內(nèi)存塊全部初始化成零?
dwBytes Long,要分配的字符數(shù)?
注解?
如指定了?GMEM_FIXED,那么返回值就是要使用的實際內(nèi)存地址即指針(GlobalLock?會返回同樣的值)——所以在使用固定內(nèi)存塊的時候不需要執(zhí)行一個?GlobalLock/GlobalUnlock?操作
由于?Win32?采用了高級的內(nèi)存管理方案,所以使用可移動的內(nèi)存塊并沒有什么好處
用這個函數(shù)分配的內(nèi)存塊允許在8位邊界以內(nèi)
GlobalLock??
函數(shù)功能描述:鎖定一個全局的內(nèi)存對象,返回指向該對象的第一個字節(jié)的指針
函數(shù)原型:
LPVOID GlobalLock( HGLOBAL hMem )
參數(shù):
hMem:全局內(nèi)存對象的句柄。這個句柄是通過GlobalAlloc或GlobalReAlloc來得到的
返回值:
調(diào)用成功,返回指向該對象的第一個字節(jié)的指針
調(diào)用失敗,返回NULL,可以用GetLastError來獲得出錯信息
注意:
調(diào)用過GlobalLock鎖定一塊內(nèi)存區(qū)后,一定要調(diào)用GlobalUnlock來解鎖。
GlobalUnlock
函數(shù)功能描述:解除被鎖定的全局內(nèi)存對象
函數(shù)原型:BOOL GlobalUnlock( HGLOBAL hMem );
參數(shù):hMem:全局內(nèi)存對象的句柄
返回值:
非零值,指定的內(nèi)存對象仍處于被鎖定狀態(tài)
0,函數(shù)執(zhí)行出錯,可以用GetLastError來獲得出錯信息,如果返回NO_ERROR,則表示內(nèi)存對象已經(jīng)解鎖了
注意:?????這個函數(shù)實際上是將內(nèi)存對象的鎖定計數(shù)器減一,如果計數(shù)器不為0,則表示執(zhí)行過多個GlobalLock函數(shù)來對這個內(nèi)存對象加鎖,需要對應數(shù)目的GlobalUnlock函數(shù)來解鎖。
如果通過GetLastError函數(shù)返回錯誤碼為ERROR_NOT_LOCKED,則表示未加鎖或已經(jīng)解鎖。
(GlobalAlloc會從heap中分配所申請大小的一段內(nèi)存,但是返回的只是一個這段內(nèi)存的HANDLE,其他程序可能會在對內(nèi)存進行操作的時候移動或者釋放這段內(nèi)存,為了防止這樣的慘劇發(fā)生,可以調(diào)用GlobalLock將這段內(nèi)存鎖住,原理就是內(nèi)存對象的內(nèi)部數(shù)據(jù)結構有一個鎖計數(shù),這個有點像線程內(nèi)核對象的UsageCount,只有當這個鎖計數(shù)減為零時系統(tǒng)在需要時才會將這段內(nèi)存移動或者釋放掉(玩膩了,可以一腳踢開)。GlobalLock就是將鎖計數(shù)加一,相反的,每次調(diào)用GlobalUnlock是將鎖計數(shù)減一。簡單點說GlobalAlloc表示你對這段內(nèi)存有興趣,不許釋放掉;GlobalUnlock表示你已經(jīng)把她玩厭了,釋放不釋放不關你的事,反正你對她沒興趣了。)
轉載于:https://www.cnblogs.com/jinxiang1224/p/8468402.html
總結
以上是生活随笔為你收集整理的GlobalAlloca GlobalLock GlobalUnlock函数的作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android USB Gadget复合
- 下一篇: 单点系统架构的可用性与性能优化