0

皆さん、よい時間を!

C++ での .dll プログラミングについていくつか質問があります。それは私にとってかなり新しいことです。

1) 複数のクラスで DLL を作成したいが、クラスごとに抽象インターフェイスを作成したい場合、インターフェイス用のヘッダー ファイルを 1 つ作成するか、抽象クラスごとに個別の複数のヘッダーを作成する必要がありますか? そして、ファクトリ関数の .cpp 実装をどうすればよいですか?

2) オブジェクトとファクトリ関数を作成し、インスタンスへのポインタを取得した場合、そのメモリを解放したいときにプログラムで「削除」を呼び出すことはできますか? そのオブジェクトはdllのページに配置されており、いくつかの問題がある可能性があると思います。この場合、メモリを適切に解放するにはどうすればよいですか?

3)複数のプロセスが.dllをバインドする場合、dllはプロジェクトごとにグローバル変数の個別のインスタンスを作成することを読みました。それは正しいですか?それが本当なら、私は2つの質問があります:

3.1) dll の静的メンバーはどうなりますか? シングルトン マネージャーを作成したい場合、それを dll に配置できますか?

3.2) Core.dll と Graphics.dll、Sound.dll と Physics.dll がある場合。Core.dll にはグローバル変数 (または、私の実際のケースではシングルトン マネージャー) があります。他の dll はシングルトンの 1 つのインスタンスで動作しますか? (各 dll は Core.dll を使用します)

私の弱い英語と、1 つのトピックでの多くの質問についてお詫び申し上げます :)

ご清聴ありがとうございました。

4

1 に答える 1

1

1: ほとんどの場合、これはあなた次第であり、プロジェクトの規模によって異なります。小さなものではほとんど問題にならないので、シンプルに保ち、ヘッダーを 1 つにします。大規模なプロジェクトでは、不要な相互依存関係をできるだけ減らすのが最善です。そのため、それらを別のファイルに入れます。他のものだけを含む「all.h」をいつでも作成できます。

2: はい、DLL と EXE の両方がマルチスレッド DLL CRT にリンクされている場合。自分が何をしているのかわからない場合は、常にこれを使用してください。これが最も安全で、期待どおりに動作するためです。これにより、exe と dll(s) が単一の実行可能ファイルであるかのようにヒープを共有できるようになります。dllでは「new Object()」、exeでは「delete obj」が自由にできます。注: EXE と DLL の異なるバージョンを混在させると、信じられないほど微妙なバグが発生する可能性があるため (たとえば、クラス/構造体の定義が変更された場合)、そうしないでください。

3: すべてのプロセスには、独自の独立したメモリ空間があります (共有メモリを取得しようとする特定のことを特に行わない限り)。プロセスが他のプロセスのメモリにアクセスすることは許可されていません。

3.1:グローバル状態を避けることを強くお勧めします。(グローバル static-const は問題ありません)。グローバル変数は多くの予想外の困難な問題を引き起こし、Windows DLL のグローバルにはさらに多くの複雑さが伴います。長期的には、EXE が呼び出さなければならない明示的な「初期化/初期化解除」関数を DLL に含める方がはるかに優れています。

しかし、DLL 内のグローバルな静的変数は、実行可能ファイル内の静的変数と大差ありません。DLL がロードされると、ほぼ同じ方法で初期化されます。(DLL を動的にロードすると事態はさらに複雑になりますが、ここでは無視します)。

3.2: はい、単一のインスタンスで動作しますが、いずれにせよそうしないでください。最終的に後悔することになります。グローバル変数が構築される順序を制御できないため、初期化を明示的に行う方がはるかに優れています。これにより、非常に困難な初期化の問題がすぐに発生する可能性があります。

于 2013-09-21T17:36:56.700 に答える