調用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,則表示未加鎖或已經解鎖。
樣本:
// Malloc memory
hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, nSize);
// Lock memory
pMem = (BYTE *) GlobalLock(hMem);
................
// Unlock memory
GlobalUnlock(hMem);