3

LoadLibrary でモジュール (exe/dll) を読み込み、その中のバイナリ リソースのポインタを取得します。

次の 3 つの手順を使用する必要がある Microsoft のメモ:

  1. FindResource を使用して HRSRC を返す
  2. その HRSRC で LoadResource を使用し、HGLOBAL を返します
  3. LockResource を使用して HGLOBAL をロックし、最終的に必要なポインターを返します。

なぜMSがこのプロセスを奇妙に設計するのか理解できませんか?

resource の長さを検出する場合は、最初の step から返されたポインターで SizeofResource を使用する必要がありますが、 step2 および step3 から返されたポインターを入力することはできません。

これらの手順から出力されたポインター アドレスを確認すると、次の結果が得られました。

  1. LoadLibrary によってロードされたモジュールのアドレス範囲内のポインター アドレスのすべて。
  2. step2 と step3 のアドレスは同じです。

これらの関数が正確に何をするかを誰が説明できますか?

4

1 に答える 1

5

これらの関数は、メモリが不足していた Windows 3.x の時代にさかのぼり、リソースは必要になるまでディスク上に保持されていました。FindResource はそれらをディスク ファイルのリソース テーブルで検索し、LoadResource はそれらをメモリにロードします。メモリは「移動可​​能」として割り当てられます。つまり、メモリ マネージャーは、必要に応じてメモリを移動して、スペースを解放し、より大きな連続したチャンクを作成できます。そのため、メモリにアクセスする前に、LockResource を使用してメモリをロックする必要がありました。

Windows 2000/XP 以降、これらの手順の多くは冗長ですが、機能は下位互換性のために残されています。

于 2012-09-03T11:41:36.347 に答える