確保後のメモリ領域のサイズを変更するにはGlobalReAlloc()関数を使います。
移動可能メモリの場合はGlobalLock()、GlobalUnlock()関数も使います。(戻る)
プロトタイプ宣言
HGLOBAL GlobalReAlloc( HGLOBAL hMem, // グローバルメモリのハンドル SIZE_T dwBytes, // 再割り当てのサイズ UINT uFlags // 再割り当ての属性 ); LPVOID GlobalLock( HGLOBAL hMem // グローバルメモリのハンドル ); BOOL GlobalUnlock( HGLOBAL hMem // グローバルメモリのハンドル );
サンプル
// 固定メモリの場合 HGLOBAL hMem, hReMem; LPTSTR lpBuff; if ( (hMem = GlobalAlloc(GPTR,100 * 1024)) != NULL ){ // 最初 100 KB確保 lpBuff = (LPTSTR)hMem; /* ここで100KBのlpBuffを使う */ // 200 KBまで拡張 if ( (hReMem = GlobalReAlloc(hMem,200 * 1024,GMEM_ZEROINIT)) != NULL ){ hMem = hReMem; lpBuff = (LPTSTR)hMem; /* ここで200KBのlpBuffを使う */ } // 50 KBに収縮 if ( (hReMem = GlobalReAlloc(hMem,50 * 1024,0)) != NULL ){ hMem = hReMem; lpBuff = (LPTSTR)hMem; /* ここで50KBのlpBuffを使う */ } // 解放 GlobalFree( hMem ); }
サンプル
// 移動可能メモリの場合 HGLOBAL hMem, hReMem; LPTSTR lpBuff; if ( (hMem = GlobalAlloc(GHND,100 * 1024)) != NULL ){ // 最初 100 KB確保 if ( (lpBuff = (LPTSTR)GlobalLock(hMem)) != NULL ){ /* ここで100KBのlpBuffを使う */ // 200 KBまで拡張 if ( (hReMem = GlobalReAlloc(hMem,200 * 1024,GMEM_ZEROINIT)) != NULL ){ if ( (lpBuff = (LPTSTR)GlobalLock(hMem = hReMem)) != NULL ){ /* ここで200KBのlpBuffを使う */ } } // 50 KBに収縮 if ( (hReMem = GlobalReAlloc(hMem,50 * 1024,0)) != NULL ){ if ( (lpBuff = (LPTSTR)GlobalLock(hMem = hReMem)) != NULL ){ /* ここで50KBのlpBuffを使う */ } } GlobalUnlock( hMem ); } // 解放 GlobalFree( hMem ); }
※コメント投稿者のブログIDはブログ作成者のみに通知されます