2

インターフェイスを公開するプログラム(私のものではなく、ソースコードはありません)があるので、プログラムによって呼び出されるDLLを作成できます。ここで、私が作成したこの DLL で変数を宣言すると、これはどのメモリ空間に格納されるのでしょうか?

つまり、EXE のアドレス空間のメモリ空間に収まるだけですよね?ただし、EXEに関してDLLはどのようにロードされますか? DLL は 1 回だけメモリにロードされると思っていましたが、DLL でローカル変数を作成することとどのように関係しているのでしょうか? (オブジェクト、クラスなど)

4

2 に答える 2

3

DLL はプロセスごとに 1 回ロードされます。むかしむかし、DLL はプロセス間で共有されていましたが、Windows 3.1 がドードーの道を進んで以来、そうではありません。

DLL で宣言するグローバル変数は、データ ページに格納されます。EXE のグローバル変数とは別のページです。

ここで、ヒープにメモリを割り当てる場合、割り当てが EXE と混在するかどうかは、使用するヒープによって異なります。EXE と DLL の両方が DLL としてリンクされた同じランタイムを使用する場合、両方とも同じヒープからメモリを取得します。ランタイムが異なる場合、またはランタイムに静的にリンクしている場合、異なるヒープを取得します。これは非常に大きなワームの缶になるので、ここではこれ以上先に進みません。

于 2011-06-09T12:35:43.000 に答える
1

DLL は、通常の実行可能ファイルのエントリ ポイントに相当する DllMain を宣言します。DLL がロードされると、DLLMain が呼び出されます。そこで行うべきことのベスト プラクティスへのリンクを次に示します

通常、そこで何らかの初期化を行います。DLL が読み込まれると、LoadLibrary を呼び出した実行可能ファイルの仮想メモリ空​​間に読み込まれます。LoadLibrary は、処理が必要なすべてのマッピングと再配置を処理します。この時点から、DLL を介して割り当てまたは変更するすべてのメモリは、マップ先のプロセスと同じ仮想メモリ空​​間にあります。

おそらく、DLL をロードし、その中である種のエクスポートされた関数を呼び出すことにより、実行可能なインターフェイスになります。基本的に、DLL がロードされた後に行うことはすべて、DLL がロードされるプロセスのメモリ空間内で行われます。

DLL がロードされたときに何が起こっているかを正確に知りたい場合は、LoadLibrary()のセマンティクスを調べる必要があります。

于 2011-06-09T12:36:32.927 に答える