最初に質問を示し、次に背景の詳細を示します。
私の質問
- DLLモジュールでグローバルオブジェクトを定義するのは良い考えですか?
- とにかく、ホストプログラムでmain()関数が呼び出される前に、DLLモジュールのグローバルオブジェクトが構築されていることをどのように確認する必要がありますか?
バックグラウンド
私はWindowsプラットフォーム上のVisualC++プロジェクトに取り組んでいます(しかし同時に、Linuxをサポートするためにソースコードのクロスプラットフォーム機能を保証する必要があります)。
私の同僚の1人は、他のプロジェクトで共有できるスタンドアロンDLLモジュールを設計および実装するように依頼されました。彼は、目的の異なる2つのDLLを開発することを計画しました。
- DLL#1-簡略化されたCOMのように見えるインターフェイスマネージャモジュール。このDLLには、ユーティリティクラスのすべてのファクトリを管理するC++クラスが含まれます。
- DLL#2-すべてのユーティリティクラスとそれに対応するファクトリクラスのコンテナ。
そのような設計に関する彼の考慮事項は次のとおりです。
- COMはクロスプラットフォーム対応ではありません。その上、COMは私たちのプロジェクトの状況には少し複雑すぎるので、彼はこの簡略化されたCOMライブラリを設計しました。
- 彼は、この簡略化されたCOMライブラリは完全に独立しており、「XMLパーサー」などのユーティリティクラスと混合すべきではないと考えているため、すべてを1つのDLLに入れるわけではありません。そして、私はこの点に同意します。
- すべてのユーティリティクラスには、対応するファクトリクラスがあります。私の同僚は、DLL#2の.cppファイルで各ファクトリクラスのグローバルオブジェクトを定義し、それらをSimplifiedCOMライブラリに登録できるようにするためのトリッキーなコードを記述しています。彼の意図は次のとおりです。グローバルオブジェクトは、ホストプログラムのmain()関数が呼び出される前に構築する必要があり、構築中に、ホストプログラムがユーティリティクラスのインスタンスを作成できるように、SimplifiedCOMに登録されます。 main()に入ります。この動作はCOMと非常によく似ています。私はこの点に同意しますが、「私の質問」のセクションで述べたように、私の質問も発生します。
実際、いくつかの実際のテストで、これらのグローバルオブジェクトを意図したとおりに構築できなかったことがわかりました。これは、悲しいことに、彼の心を傷つけます;-)。しかし、彼のデザインはまだ見栄えが良いと思うので、それを機能させる方法を見つけたいと思います。これらのDLLは、次のように使用することをお勧めします。DLLは、libsおよびincludesを使用して開発者のコンピューターにデプロイされます。次に、具体的なVC ++プロジェクトに、リンク時に組み込まれます。現在、コンパイルエラーやリンクエラーは発生していませんが、DLL#2のこれらのグローバルオブジェクトだけが希望どおりに作成されていません。