1

私は現在、複数のクライアントに対して同様の目的を果たすアプリケーションを作成していますが、フィードされたデータを処理する方法を調整する必要があります。本質的には同じ目的を果たしますが、データの配布方法はまったく異なります。

そこで、次のように進めることにしました: -すべての方法で共通の機能を保持する共通のエンジン ライブラリを作成し、異なるエンジンが同じように応答することを保証するデフォルト インターフェイスを提示します。-それぞれの機能方法に固有のエンジンを作成します....それぞれが独自の .dll にコンパイルされます。

したがって、私のプロジェクトは、次のようないくつかのライブラリを含む一連のライブラリで終了します。

ユーザー設定に使用する構成ファイルには、エンジンセクションがあり、使用するエンジンを決定できます。

[ENGINE]
Way1

したがって、コードのどこかで次のことを行います。

If (this->M_ENGINE == "Way1")
  //load dll for way1
Else If (this->M_ENGINE == "Way2")
  //load dll for way2
Else
  //no engines selected...tell user to modify settings and restart application

問題は...この方法でdllをインポートするにはどうすればよいですか? それは可能ですか?そうでない場合、同様の機能を実現する方法について提案を得ることができますか?

最初にすべての dll をインポートして、使用するエンジンを選択するだけでよいことは承知しています。これらの dll をすべて顧客に出荷する必要があります。ある顧客はあるエンジンを使用し、別の顧客は別のエンジンを使用します。一部のお客様は複数のファイルを使用する可能性があるため、これを外部化して、ユーザーがエンジンの切り替えに構成ファイルを使用できるようにしたいと考えました。

何か案は?

編集:エンジンが実行時に動的にロードされ、プロジェクトですべてが参照されていない場合、各エンジンが同じインターフェイスを提示しても、プロジェクトはコンパイルされないことに気付きました。ですから、それらすべてをプロジェクトに含める以外に選択肢はありませんね。

それはまた、それらすべてが私の顧客に出荷されなければならないことを意味します. 構成内の設定は、エンジン メンバーの初期化に使用するクラスのみを指定します。

また

これらの各エンジンを同じ名前にコンパイルできます。メイン プロジェクトに 1 つの DLL のみをインポートすると、その特定のエンジンが常に使用されます。これにより、私の顧客は、自分の複数のクライアントに対して私たちのアプリケーションを使用できなくなります。彼らが手動でdllを切り替えようとしない限り。ユック

助言がありますか?

編集 #2: この時点でオプションを確認すると、ベース エンジンとすべての子エンジン、および構成を含む 1 つの大きな DLL を作成して、ユーザーが選択できるようにすることもできます。複数の dll を参照してそれらすべてを出荷する代わりに。巨大なものを 1 つだけ用意し、その 1 つだけを出荷/参照します。ニーズに合った 1 つまたは 2 つの小さな dll ではなく、すべての顧客に 1 つの大きな dll を出荷することを意味するため、私はこれがあまり好きではありません。これは私が思いついた最善の解決策です。

元の質問に対するより良い提案や回答をまだ探しています。ありがとう。

4

2 に答える 2

2

エンジンごとに個別のDLLを使用し、メインプロジェクトでLoadLibraryを使用して、構成に基づいて特定のエンジンをロードします。

すべてのエンジンが派生するいくつかの共通ヘッダーファイルにエンジンインターフェイスを含め、このインターフェイスはメインプロジェクトでも使用されます。

次のようになります。

// this should be an abstract class
class engine {
public:
     virtual void func1() = 0;
     virtual void func2() = 0;
...
};

異なるエンジン実装ごとに、DLLから次のような関数をエクスポートします。

// might aswell use auto_ptr here
engine* getEngine() { return new EngineImplementationNumberOne(); }

これで、メインプロジェクトで、LoadLibraryを使用して目的のDLLをロードし、次にgetProcAddressgetEngine関数をロードするだけです。

string dllname;

if (this->M_ENGINE == "Way1")
     dllname = "dllname1.dll";         
else if (this->M_ENGINE == "Way2")
     dllname = "dllname2.dll";
else
     throw configuration_error();

HMODULE h = LoadLibraryA(dllname.c_str());
typedef engine* (*TCreateEngine)();

TCreateEngine func = (TCreateEngine)GetProcAddress(h, "getEngine");
engine* e = func();

エクスポートされた関数の名前はおそらく混乱するため、DLLでDEFファイルまたはextern "C"を使用できます。また、エラーをチェックすることを忘れないでください。

于 2009-05-14T19:10:05.187 に答える