1

現在のアプリケーションは、複数のページを含む単一のOpenGLEXEです。EXEは、UDPを介してネットワーク経由で送信されるデータにアクセスする責任があります。データを蓄積し、多数のシングルトン構造に格納します。EXE内の個々のページは、シングルトン構造にアクセスして、適切と思われるデータを処理します。

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

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

  1. 現在別々のシングルトンに格納されているすべてのデータを、「真の」シングルトンをエクスポートする別のDLLにまとめます。例えば。DLLからエクスポートされたシングルトンは、EXEがロードしたものに関係なく、共有メモリのようなものです。これは興味深い選択ですが、展開シナリオで問題が発生する可能性があります。人々が本当にこの考えに夢中になっているなら、私はそれらの問題について詳しく説明することができます。
  2. 関連するすべてのデータを含む静的DLLレベルの構造を作成します。EXEは、DLLのロード時にこのデータをDLLにプッシュダウンし、DLL内に含まれるページがデータにアクセスできるようにします。これは、アプリケーションのすべてのページを編集する必要がある場合でも、100を超える最も簡単な解決策のようです。また、少しずさんなようです。すべてのデータはグローバルにあります。あまりセクシーでもC++yでもありません。

それで、他の誰かがこの問題の解決策を持っていますか?

このアプリケーションは、WindowsXPで使用するためにVisualC ++ 9.0(VisualStudio 2008)を使用して作成されています。何らかの理由で、Vistaは、お客様が使用しているにもかかわらず、ラボではまだサポートされていません。

4

5 に答える 5

1

すべてのDLLに関数SetGlobalDataPointer(Singleton *)を与えます。EXEは、他のDLL関数を呼び出す前に、この関数を呼び出します。DLLコードで、シングルトンのすべてのオカレンスを置き換えます。シングルトンPtrによって->

于 2008-10-01T10:30:41.623 に答える
0

次のいずれかを実行できます。

  • すべてのバーを最も外側のシェルに「共通の」DLLに入れます。
  • DEFファイルを使用して、EXEからエクスポート関数を生成します。

2つ目は非常にまれですが、DEFファイルからインポートライブラリを生成することは可能です。LIB/DEFを使用してインポートライブラリを生成します。ライブラリのインポートとファイルのエクスポートの操作を参照してください。

于 2008-09-17T15:57:38.977 に答える
0

残念ながら、いじくり回す既存のコードがたくさんあるようです。その場合は、(2)が大きくなりすぎて扱いにくくならないことを前提に、(2)を使用します。

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

(2)が面倒な場合は、Serialize / UnSerialize()関数を使用して基本の「DLLPage」クラスを作成するために少しリファクタリングします。クラス自体はエクスポートせず、必要な個々の関数のみをエクスポートしてください(これは、クラスが変更されるときに非常に役立ちます...クラスレベルのエクスポートでは非常に奇妙な中断が発生します)。コンストラクタ/デストラクタ、そしておそらくすべてのパブリックメンバーが必要になります。

ヒープ管理の問題が発生する可能性があるため、new / deleteをオーバーロードし、すべてのクラスでヘルパーDLLにある一元化されたnew/deleteを使用するようにします。

于 2008-09-17T15:58:14.390 に答える
0

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

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

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

于 2009-01-13T19:04:31.397 に答える
0

EXE を分割することに飛び込む前に、メモリ管理と DLL について調べておく必要があります。

これは、CRT オブジェクトの問題について説明している記事の 1 つですが、同じことが独自の C++ オブジェクトにも当てはまります。

DLL の境界を越えて CRT オブジェクトを渡す際の潜在的なエラー

于 2008-09-17T16:07:47.847 に答える