<Return[UV]><Top>

VirtualFreeEx

Declare Function Api_VirtualFreeEx& Lib "kernel32" Alias "VirtualFreeEx" (ByVal hProcess&, lpAddress As Any, ByRef dwSize&, ByVal dwFreeType&)

Declare Function VirtualFreeEx Lib "kernel32" Alias "VirtualFreeEx" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long

指定されたプロセスの仮想アドレス空間内のメモリ領域を解放またはコミット解除する。

パラメータ
hProcess
    プロセスのハンドルを指定する。このプロセスの仮想アドレス空間内のメモリが解放される。
    このプロセスに PROCESS_VM_OPERATION アクセス権を割り当てておかなければならない。このアクセス権がない場合、関数は失敗す

    る。
lpAddress
    解放したい領域の開始アドレスへのポインタを指定する。
    dwFreeType パラメータで MEM_RELEASE フラグをセットした場合、lpAddress は、領域を予約したときに VirtualAllocEx 関数が返した

    ベースアドレスと同じ値でなければならない。
dwSize
    解放したいメモリ領域のサイズを、バイト単位で指定する。
    dwFreeType パラメータで MEM_RELEASE フラグがセットされている場合、dwSize パラメータは 0 でなければならない。最初に

    VirtualAllocEx 関数を呼び出して確保された領域全体が解放される。

    MEM_DECOMMIT フラグがセットされている場合、lpAddress パラメータの値〜(lpAddress 値+ dwSize 値)の範囲に含まれる 1 バイトま

    たは複数のバイトを保持するすべてのメモリページがコミット解除される。たとえば、2 バイトの範囲がページ境界をまたいでいるとき、この

    関数は両方のページをコミット解除する。
    この関数は、VirtualAllocEx によって既に予約されている領域全体をコミット解除する。ただし、次の 3 つの条件が成立していることが前

    提である。
    •MEM_DECOMMIT フラグがセットされている。
    •lpAddress パラメータは、領域を予約したときに VirtualAllocEx 関数が返したベースアドレスと同じ値である。
    •dwSize パラメータは 0 である。
    この結果、領域全体は予約済みの状態になる
dwFreeType
    解放操作のタイプを表す一連のビットフラグを指定する。次の 2 つのフラグのいずれかを指定する。

    フラグ                      

意味                                                                                                                                       

    MEM_DECOMMIT

 

 

指定されたページ領域をコミット解除する。このページは、予約済みの状態になる。
コミット解除済みのページをコミット解除しようとしても、関数は失敗しない。これは、ページ範囲の現在のコミット状態を決定しなくても、ページ範囲をコミット解除できることを意味する。

    MEM_RELEASE

 

 

指定されたページ領域を解放する。これらのページは空き状態になる。
このフラグをセットする場合、dwSize パラメータは 0 でなければならない。また、lpAddress は、領域を予約したときに VirtualAllocEx 関数が返したベースアドレスを指していなければならない。これらの条件の一方または両方が満たされていない場合、関数は失敗する。。

 

領域内のいずれかのページが現在コミット済みである場合、この関数は最初にそのページをコミット解除し、次に解放する。
複数のページが異なった状態にあり、一部が予約済み、一部がコミット済みという状況でこれらのページを解放しようとしても、関数は失敗しない。これは、ページ範囲の現在のコミット状態を決定しなくても、ページ範囲を解放できることを意味する。


戻り値

    関数が成功すると、0 以外の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。

解説
    プロセスの仮想アドレス内の各メモリページは、次の 3 つの状態のいずれかになる。

    状態                             

意味                                                                                                                                    

    Free(空き)

 

 

このページはコミットも予約もされていない。このプロセスからは、このページにアクセスできない。空きページの読み取りや書き込みを行おうとすると、アクセス違反の例外が発生する。
VirtualFreeEx 関数を使って、予約済みまたはコミット済みのメモリページを空き状態に変更できる。

    Reserved(予約済み)

 

 

 

このページは予約済みである。他の割り当て関数はこのアドレス範囲を利用できない。このページにはアクセスできない。また、物理格納域も関連付けられていない。空きページの読み取りや書き込みを行おうとすると、アクセス違反の例外が発生する。
VirtualFreeEx 関数を使うと、コミット済みメモリページを予約済み状態へ変更したり、予約済みメモリページを空き状態に変更できる。

    Committed(コミット済み)

 

 

このページはコミット済みである。このページにはメモリ内の物理格納域またはディスク上のページングファイルがすでに割り当てられていて、アクセスは保護コードによって制御されている。
こうしたページに最初に読み書きもうとしたときにのみ、システムはそのページを初期化し、コミット済みの各ページを物理メモリへロードする。

プロセスが終了すると、システムはコミット済みページに関連付けられているすべての格納域を解放する。
VirtualFreeEx 関数を使って、コミット済みのメモリページを予約済み状態または空き状態へ変更できる。

    VirtualFreeEx 関数は、次の操作を実施できる。
    •コミット済みまたはコミット済みではない領域をコミット解除する。この操作の後、それらのページは予約済み状態になる。
    •予約済みページ領域を解放する。この操作の後、それらのページは空き状態になる。
    •コミット済みまたはコミット済みではない領域をコミット解除し、解放する。この操作の後、それらのページは空き状態になる。
    複数のページが異なった状態にあり、一部がコミット済み、一部がコミットされていないという状況でも、VirtualFreeEx 関数はこれらのペー

    ジをコミット解除できる。これは、各ページの現在のコミット状態を決定しなくても、ページ範囲をコミット解除できることを意味する。ページをコ

    ミット解除すると、メモリ内、またはディスク上のページングファイル内の対応する物理格納域が解放される。
    ページをコミット解除するだけで解放しない場合、予約済み状態に代わる。その後、VirtualAllocEx 関数を呼び出してそのページをコミット

    するか VirtualFreeEx 関数を呼び出すと、そのページが解放できる。予約済みページの読み取りまたは書き込みを行おうとすると、アクセ

    ス違反の例外が発生する。
    複数のページが異なった状態にあり、一部が予約済み、一部がコミット済みという状況でも、VirtualFreeEx 関数はそのページ範囲を解放

    できる。これは、各ページの現在のコミット状態を決定しなくても、ページ範囲を解放できることを意味する。VirtualAllocEx 関数を使って最

    初に予約したページ範囲全体を、一度に解放しなければならない。
    ページを解放すると、空き状態へ変化し、それ以降の割り当て操作で利用できるようになる。メモリを解放またはコミット解除した後は、そ

    のメモリを参照できない。また、それまでメモリ内に記録されていたすべての情報は失われる。空きページの読み取りまたは書き込みを行お

    うとすると、アクセス違反の例外が発生する。まだ情報が必要な場合は、その情報を保持するメモリのコミット解除や解放を行わない。