2008-09-17 8 views
1

現在のアプリケーションは、複数のページを含む単一のOpenGL EXEです。 EXEは、UDP経由でネットワーク経由で送信されたデータにアクセスする役割を担います。データを蓄積し、シングルトン構造のホストに格納します。 EXE内の個々のページは、シングルトン構造にアクセスして、データが適切に処理されるように処理します。1つまたは複数のDLLにEXEデータを渡す

EXEフットプリントを軽くし、構成管理の試みをサポートするため、EXEがロードする単一のDLLにページを分割することにしました。 EXEをDLLからのページが読み込まれるシェルにすることが私たちの意図です。 EXEは引き続きすべての通信責任(UDP、Corba、Userなど)を持ちます。これらのページは、それが何であれ表示する責任があります。

質問(最終的に)は次のようになります。EXEから収集された無数のデータを消費するDLLベースのページにどのように渡すのですか。シングルトンのコンセプトは、私たちが使用するシングルトン(ACE_Singleton)がこのレベルの方向を許さないので、もはや水を保持しません。私たちはシングルトンをDLLから消費しているEXEに一日中エクスポートすることができますが、私はまだその逆を理解していません。私は、次のオプションが出ている - 私が好きどれも、ので、私はそこに誰かがよりよいものを持っているでしょう期待していた:)

  1. 別のDLLに、現在別のシングルトンに格納されているすべてのデータをラップそれは「真の」シングルトンを輸出するだろう。例えば。 DLLからエクスポートされたシングルトンは、EXEがロードしたものとは無関係に、共有メモリのようなものです。これは興味深い選択ですが、展開シナリオの問題を引き起こします。私は、人々がこのアイデアで本当に打ち負かされるならば、それらの問題について詳しく説明することができます。
  2. すべての関連データを含む静的DLLレベル構造を作成します。 EXEはDLLロード時にこのデータをDLLにプッシュし、DLLに含まれるページがデータにアクセスできるようにします。これは、最も単純なソリューションのように思えます。たとえそれがアプリケーション内のすべてのページを編集していても、100以上です。すべてのデータはまさにグローバルにあります。それほどセクシーではない、あるいはC++ yでも。

この問題の解決策が他にありますか?

アプリケーションは、Windows XPで使用するためにVisual C++ 9.0(VisualStudio 2008)を使用して記述されています。何らかの理由で、たとえ私たちの顧客がそれを使用していても、まだVistaは私たちのラボではサポートされていません。

答えて

0

次のいずれかの可能性:

  • は、すべてが「共通の」DLLへの非常に最外殻をバーに置きます。
  • EXEからエクスポート関数を生成するためにDEFファイルを使用します。

2番目は非常に珍しいですが、DEFファイルからインポートライブラリを生成することは可能です。 LIB/DEFを使用してインポートライブラリを生成します。 Working with Import Libraries and Export Filesを参照してください。

0

残念ながら、既存のコードがたくさんあるようです。その場合、大きすぎて扱いにくくないと仮定して、(2)と一緒に行きます。

あなたの説明から、EXEレベルのデータはDLLロード時に一度だけ送信する必要があるようです。

(2)があまりにも面倒であれば、私はSerialize/UnSerialize()関数を持つ基本 "DLLPage"クラスを少しリファクタリングしたいと思います。クラスそのものをエクスポートしないでください。クラス内で必要な個々の関数だけがエクスポートされます(これは、クラスが変更されると非常に役に立ちます。クラスレベルのエクスポートでは非常に不自然なブレークが発生します)。コンストラクタ/デストラクタ、そしておそらくすべてのpublicメンバが必要になります。

ヒープ管理の問題がある可能性があるので、新しい/削除をオーバーロードし、すべてのクラスでヘルパーDLLにある新しい一括/削除を使用することもできます。

1

すべてのDLLに関数SetGlobalDataPointer(シングルトン*)を付けます。 EXEは他のDLL関数を呼び出す前にこの関数を呼び出します。 DLLコードで、theSingletonのすべての出現を置き換えます。 by theSingletonPtr->

0

最初のオプション:exeが共有メモリに保持するすべてのデータを配置します。適切なロックがある限り、dllはそれにうまくアクセスできます。

2番目のオプション:エクスポートされた関数ポインタを使用してdllにメモリを転送する - exeに関数がある場合、dllはdllが呼び出し可能なポインタとしてこの関数を返すexeファイル内の別の関数を呼び出します。エクスポートされた関数は、スタック上の通常の構造体としてデータを転送できます。

第3のオプション:同じランタイムを使用する場合は、メモリに直接アクセスできるポインタをエクスポートするだけです。

関連する問題