GlobalAlloc でメモリ領域の割り当て

GlobalAlloc でメモリ領域を割り当てます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

固定メモリを確保

  1. C++ からは new でメモリ領域を確保するようになりました。
    詳細は new でメモリ領域の割り当て を参照して下さい。
    とは言え、幾つかのアプリケーションでは GlobalAlloc() で領域を確保することが要求されます。
  2. 固定メモリを確保するメインプログラムのソースコードです。
    /*******************************************************/
    /*★ GlobalAlloc でメモリ領域を割り当てる    前田 稔 ★*/
    /*******************************************************/
    #include    <windows.h>
    
    char    *p_char= NULL;
    char    buf[80];
    
    //★ Windows Main 関数
    int  WINAPI  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {
        p_char= (char *)GlobalAlloc(GMEM_FIXED,40);
        strcpy(p_char,"GMEM_FIXED,40 を確保");
        wsprintf(buf,"%s",p_char);
        MessageBox(NULL,buf,"GlobalAlloc(GMEM_FIXED,40)",MB_OK);
        GlobalFree(p_char);
        return 0;
    }
        
  3. GlobalAlloc() でメモリ領域を割り当てます。
    GMEM_FIXED が固定メモリの指定で 40 が確保するバイト数です。
    割り当てたメモリ領域のポインタをキャストして p_char に格納します。
    p_char= (char *)GlobalAlloc(GMEM_FIXED,40);
  4. 割り当てた領域は GlobalFree() で開放して下さい。
    GlobalFree(p_char);

移動可能メモリを確保

  1. 移動可能メモリを確保するメインプログラムのソースコードです。
    /*******************************************************/
    /*★ GlobalAlloc でメモリ領域を割り当てる    前田 稔 ★*/
    /*******************************************************/
    #include    <windows.h>
    
    HGLOBAL hGlobal= NULL;
    LPSTR   lpStr;
    char    buf[80];
    
    //★ Windows Main 関数
    int  WINAPI  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {
        hGlobal = GlobalAlloc(GMEM_MOVEABLE,80);
        if (hGlobal==NULL)  return -1;
        lpStr= (LPSTR)GlobalLock(hGlobal);
        strcpy(lpStr,"GMEM_MOVEABLE,80 を確保");
        wsprintf(buf,"%s",lpStr);
        MessageBox(NULL,buf,"GlobalAlloc(GMEM_MOVEABLE,80)",MB_OK);
        GlobalUnlock(hGlobal);
        if (hGlobal)    GlobalFree(hGlobal);
        return 0;
    }
        
  2. GlobalAlloc() で移動可能メモリ領域を割り当てます。
    GMEM_MOVEABLE が移動可能メモリの指定で 80 が確保するバイト数です。
    GlobalAlloc() で戻されるのはメモリのハンドルです。
    hGlobal = GlobalAlloc(GMEM_MOVEABLE,80);
  3. ハンドルからポインタを取得するには、GlobalLock() 関数を使用します。
    GlobalLock() 関数を実行すると参照カウントがインクリメントされます。
    lpStr= (LPSTR)GlobalLock(hGlobal);
  4. 参照が終わると GlobalUnlock() 関数を使用します。
    GlobalUnlock() 関数を実行すると参照カウントがデクリメントされます。
    GlobalUnlock(hGlobal);
  5. 割り当てた領域は GlobalFree() で開放して下さい。
    if (hGlobal) GlobalFree(hGlobal);

【メモ】

割り当てた領域のサイズは GlobaalSize() で知ることができます。
実際に確保される領域は、境界調整の都合で要求したサイズよりも大きいことがあります。

最近では関数で領域を確保する方法は使われなくなり、new, delete が使われるようになりました。
理由は簡単でコンストラクタが呼び出せないからです。
実は C++ では、int型のような基本データ型にもコンストラクタがあります。
C# では int型 に ToString() などのメソッドも用意されています。

超初心者のプログラム入門(Win32API C++)