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

LocalAlloc でメモリ領域を割り当てます。
LocalAlloc はコンベンショナルメモリに領域を割り当てる関数ですが、Win32 では LocalAlloc と GlobalAlloc の違いはありません。
コンベンショナルメモリとは MS-DOS が伝統的に用いていたメモリ領域のことで、具体的にはプロセッサ 8086 が処理できる 0x00000 ~ 0x9FFFF の 640K バイトのアドレス空間のことです。
プロセッサが 32 ビットになっても互換性のためにコンベンショナルメモリは足かせとして存在しつづけ、それは Windows 95 や 98, Me に至ってもなおヒープメモリなどの制限として残り続けています。

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

プロジェクトの設定

  1. C++ からは new でメモリ領域を確保するようになりました。
    詳細は new でメモリ領域の割り当て を参照して下さい。
    とは言え、幾つかのアプリケーションでは GlobalAlloc() で領域を確保することが要求されます。
  2. メインプログラムのソースコードです。
    /******************************************************/
    /*★ LocalAlloc でメモリ領域を割り当てる    前田 稔 ★*/
    /******************************************************/
    #include    <windows.h>
    
    HLOCAL  hLocal= NULL;
    LPSTR   lpStr;
    char    buf[80];
    
    //★ Windows Main 関数
    int  WINAPI  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {
        hLocal= LocalAlloc(LMEM_FIXED,32);
        if (hLocal==NULL)   return -1;
        lpStr= (LPSTR)LocalLock(hLocal);
        strcpy(lpStr,"LocalAlloc(LMEM_FIXED,32)");
        wsprintf(buf,"%s",lpStr);
        MessageBox(NULL,buf,"LocalAlloc でメモリを割り当て",MB_OK);
        LocalUnlock(hLocal);
        if (hLocal)     LocalFree(hLocal);
        return 0;
    }
        
  3. LocalAlloc() でメモリ領域を割り当てます。
    LocalAlloc() で戻されるのはメモリのハンドルです。
    hLocal= LocalAlloc(LMEM_FIXED,32);
  4. ハンドルからポインタを取得するには、LocalLock() 関数を使用します。
    LocalLock() 関数を実行すると参照カウントがインクリメントされます。
    lpStr= (LPSTR)LocalLock(hLocal);
  5. 参照が終わると LocalUnlock() 関数を使用します。
    LocalUnlock() 関数を実行すると参照カウントがデクリメントされます。
    LocalUnlock(hLocal);
  6. 割り当てた領域は LocalFree() で開放して下さい。
    if (hLocal) LocalFree(hLocal);
  7. LocalAlloc と GlobalAlloc に違いは無いと言うことなので、LocalAlloc() の領域を GlobalLock() してみました。
    使い方としては、おかしいのでしょうが問題なく実行できました。
        hLocal= LocalAlloc(LMEM_FIXED,80);
        if (hLocal==NULL)   return -1;
        lpStr= (LPSTR)GlobalLock(hLocal);
        if (lpStr)
        {    strcpy(lpStr,"LocalAlloc() を GlobalLock する");
             MessageBox(NULL,lpStr,"LocalAlloc で GlobalLock を使用する",MB_OK);
             GlobalUnlock(hLocal);
        }
        if (hLocal)    LocalFree(hLocal);
        

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