<Return[UV]><Top>

VirtualLock

Declare Function Api_VirtualLock& Lib "kernel32" Alias "VirtualLock" (ByRef lpAddress As Any, ByVal dwSize&)

Declare Function VirtualLock Lib "kernel32" (ByRef lpAddress As Any, ByVal dwSize As Long) As Long

プロセスの仮想アドレス空間をメモリへロックし、その領域へのそれ以降のアクセスでページフォールトが発生しないようにする。

パラメータ
lpAddress
    ロックしたいページ領域のベースアドレスへのポインタを指定する。
dwSize
    ロックしたいページ領域のサイズを、バイト単位で指定する。関係するページ領域は、lpAddress 値〜(lpAddress 値 + dwSize 値) の範

    囲に含まれる 1 バイトまたは複数のバイトを保持するすべてである。2 バイトの範囲がページ境界をまたいでいる場合、両方のページが解放

    されることになる。

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

解説
    指定した領域内のすべてのページはコミット済みでなければならない。PAGE_NOACCESS フラグによって保護されているメモリは、ロックで

    きない。
    ページをメモリにロックすると、利用可能な RAM が減少するため、他の重要なページがページングファイルにスワップアウトされて、システム

    のパフォーマンスが低下することがある。既定では、1 つのプロセスは最大 30 ページをロックできる。パフォーマンスの大幅な低下を避ける

    ために、意図的に小さく制限してある。それより多くのページ数をロックする必要のあるアプリケーションでは、最初に 関数を呼び出して、最

    小と最大のワーキングセットサイズを拡大しなければならない。プロセスがロックできる最大ページ数は、最小ワーキングセット内のページ数

    から、小規模なオーバーヘッドを引いた値である。
    プロセスがロックしたページは、そのプロセスが長期間にわたってアイドル状態になった場合でも、ロックされたままの状態になる。
    ロック済みページ領域をロック解除するには、VirtualUnlock 関数を使う。プロセスが終了すると、ロック済みページは自動的にロック解除さ

    れる。
    この関数はロックカウントをインクリメント(値を 1 増やす)しない点、およびハンドルをポインタへ変換する点で、GlobalLock 関数や

    LocalLock 関数とは異なる。仮想ページにはロックカウントは存在しないので、ページ領域をロック解除するために VirtualUnlock 関数を複

    数回呼び出す必要はない。

    Windows 95/98:VirtualLock 関数は何もしないスタブとして実装されていて、常に 0 以外の値を返す。