プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

メモリサイズの拡張/収縮

2007年09月14日 18時37分59秒 | メモリ関連

確保後のメモリ領域のサイズを変更するには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 );
}

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« メモリの動的確保/解放 | トップ | メモリ属性の変更 »
最新の画像もっと見る

コメントを投稿

メモリ関連」カテゴリの最新記事