2013-12-19 12 views
7

Googleでこの質問の回答を見つけることがなぜ難しいのか分かりませんが、何かを真剣に設定したいと思います。win32実行可能リソースはどのように処理されますか?

は、静的データは、そのデータはプロセスの全体のランタイムのRAMに保持されているのと同じように処理win32のリソースであるか、メモリにロードされるまで、彼らは通常のファイルのようにディスク上に保存されていますか? LoadResource/LoadStringのような関数は後者を意味しますが、私は抽象化に惑わされていないことを絶対に確信したいと思います。

+0

一般に、ロードされるまでディスクに残りますが実装の詳細とみなしてください。パフォーマンス上の理由から、OSは実行可能ファイルをメモリに完全にロードすることを決定します(十分な大きさの場合)。何故なの? –

+1

実行可能ファイルはメモリマップされている可能性が高いので、LoadResourceは実行ファイルのその部分をページ単位でスワップさせ、RAMが必要なときにスワップアウトします。それは私がそれをやる方法です、少なくとも。 – Gene

+1

@Gene:それは実際に最近どのように行われているのですか?あなたのコードとまったく同じ方法でデマンドページされます。好奇心の強い関数名の理由は、実際にWin16でデータを読み込んだ後、基本的なAPIが互換性の理由でスタックしていたからです。しかし、LoadStringは実際にはテキストをロードします(最終的にはバッファパラメータをとります) – doynax

答えて

6

は、リソースがロード中にメモリにコピーされ、そしてあなただけの彼らにハンドルを得ました。メモリマネージャは、メモリ内のコピーを移動してスペースを最適化したり、必要になるまで秘密にリソースをアンロードしたりすることもできます。リソースが必要なときは、リソースをメモリに「ロック」するための第2のステップがありました。これはあなたにコピーへのポインタを与え、あなたが再びそれをロック解除するまで、リソースマネージャがそれを動かさなかったことを確認しました。

32ビットバージョンのWindowsでは、リソースはコピーされません。実行可能ファイル(またはDLL)はメモリにマップされ、リソースに触れた場合、仮想メモリマネージャーはそれがあなたのために存在することを確認します。

API(FindResource、LoadResource、LockResource)は、古い日、リソースへのハンドル、ハンドルのロックなどを反映しますが、ハンドルはリソースの先頭へのポインタにすぎないため、ロックは効果的にノーオペレーションで、ハンドルをポインタ型にキャストして返します。

3

すべてのリソースAPIがhModule引数を受け入れることに気付くかもしれません - これは実際にはメモリ上のモジュールのPEヘッダーへのポインタであり、ディスク上のファイルへのハンドルではありません。したがって、PEファイル(.rsrc)のリソースセクションは、それらのAPIが動作するためにプログラムのメモリ空間に存在しなければなりません。もちろん、すべてのメモリマップされたファイルと同様に、データは必要になるまで実際に物理RAMに実際にはページされません。 (Windows 3.1とそれ以前のような)昔は

+0

['GetModuleFileName'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms683197.aspx)を使用すると、リソースセクション**がそれらのメモリに存在する必要があるという厳しい要件作業するAPIは保持されません。 – IInspectable

+0

@IInspectable:これはリソースAPIではありません。 –

+0

私はそれがそれを暗示していませんでした。私の指摘は、モジュールハンドルとファイルバッキングへのハンドルは、同じ意味で使用できます。あなたの結論が間違っていると言っているわけでもありません。しかし、その結論に達する理由は改善の余地がある。 – IInspectable

関連する問題