2011-08-17 6 views
2

C++ DLLを使用するVB6アプリケーションがあるとします。彼らは同じメモリを共有しています(あなたは他のポインタを使用することができます)。 DLLはPublic Declare Function ... Lib ...DLLのグローバル変数はどこに格納されていますか?

でVB6アプリ内で宣言され、どのようにこのフィット感はで哲学「スタックは、メモリの片側から他のヒープを成長」するのでしょうか? DLLのスタックはどこにありますか?アプリケーションの起動時にグローバルDLL変数が割り当てられますか?もしそうなら、私はDLLから関数を実行しようとするとエラーが出るのはなぜですか?

+4

なぜ私たちにヒントを与えて、エラーメッセージを教えてください。 – jdigital

+0

エラーはありません。それは完全に動作します。私は、DLLのグローバル変数がどこにあるのか不思議です。私はプロセスが片方から成長してスタックを積み重ねていると思ったので、動的にロードされるDLLのグローバル変数を説明することが難しくなりました。 –

答えて

4

VB6は、データセグメントではなくモジュールレベルの変数にthread local storageを使用します。つまり、モジュール内のパブリック(グローバル)変数は、スレッドごとに異なる値を持つことができます。これは、C/C++開発者が慣れていないものです。

2

グローバルDDLシンボルは、DLLイメージ自体にあります。 DLLがシンボルをいくつかの動的メモリを接続するポインタとして使用する場合、メモリは動的割り当ての元のもの(通常はCRTによって使用されるヒープ)からのものになります。私たちは、C++インポートのVB宣言がどのように見えるか、そしてC++ DLLがどのようにしてDllMainで初期化できるか、DLLイメージ内の静的領域であるか、Init関数などの呼び出しを必要とするかなどを正確に確認する必要があります。 。

「スタックはメモリの片側から成長し、ヒープはもう一方から成長する」は8088プロセッサで真であるかもしれませんが、現代のプラットフォームではそうは起こりません。スタックはスレッドごとに割り当てられ、上に行くが、実際には何百ものスタックがプロセス内に存在する可能性がある。ヒープはすべての場所に配置され、基本的にランダムに成長します。また、典型的なプロセスにはいくつかのヒープがあります。

4

グローバル変数は、データセグメントに格納されます。

http://en.wikipedia.org/wiki/Data_segment

スタックは、ローカル変数のみに使用されます。

+0

はい、データセグメントは、OPが欠けているメモリの一部です。地元の人々は積み重ねて生活し、動的に割り当てられたオブジェクトはヒープに住んでいますが、静的/グローバルは、それらが所属するexeまたはdllのデータセグメントに存在します。 – BrendanMcK

1

通常、スレッドごとに1つのスタックがあります。 DLL内の関数は、現在のスレッドのスタック(スレッドが呼び出されたスレッド)を使用します。

メモリ管理に関するその他の質問に対するRemusの回答を参照してください。

関連する問題