2011-03-30 16 views
2

MSDNには、ファイルマッピングオブジェクトを(CreateFileMapping関数がINVALID_HANDLE_VALUEに設定HFILEパラメータで呼び出される)ページングファイルによってバックアップされている場合は、ページングファイルは、全体のマッピングを保持するのに十分な大きさでなければならないMapViewOfFileが失敗しないのはなぜですか?

を言います。そうでない場合、MapViewOfFileはに失敗します。

しかし、このコードは、ページファイルが存在しない場合でも動作します。どうして?

HANDLE mm; 
LPVOID addr; 

mm = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024 * 1024, NULL); 
if (mm != NULL) { 
    addr = MapViewOfFile(mm, FILE_MAP_ALL_ACCESS, 0, 0, 1024 * 1024); 

    if (addr != NULL) { 
     MessageBox(0, NULL, NULL, 0); 
    } 
} 
+1

どのようにページファイルを削除したのですか? –

+0

それが決定的に_not_何ページファイルを持っていないシステム上のメッセージボックスを表示する必要がありますようなコードは(念のために、あなたはそれがメッセージボックスを表示_does_言っている?)見えます。 SEC_COMMIT考えると、オペレーティングシステムは(だけでなく、理論的にはSEC_RESERVEのように)、メモリが実際に存在することを確認する必要があり、私は非としてRAMにメモリ全体をロックすることによって、それはよりも、そのページファイルなしに、他の操作を行う可能性がどのように表示されませんそれは確かにしません。 – Damon

+0

明らかにあなたは間違っており、システムは依然として対処するページファイルを持っています。そうしないと、呼び出しが失敗するだけです。 –

答えて

2

なぜ失敗するのですか? VirtualAlloc()で割り当てられたページは、ページングファイルにもマップされます。それは失敗しない、あなたは実際のプログラムを開始することができませんでした。ページングファイルによってバックアップされていないMMFを作成何ら問題はそうありませんが、メモリはとにかくマップされていないことができない、それが恒久的にRAMに貼り付けられています。

は、あなたがこの異常な何かをするとき、文書化のルールがまだ有効であることを前提としないでください。

関連する問題