問題に少しぶつかり、最適なソリューションコンセプト/理論を探しています。モジュールとクラスの扱い(動的リンク)
私はオブジェクトを使用する必要があるシステムを持っています。システムが使用する各オブジェクトには既知のインタフェースがあり、抽象クラスとして実装されている可能性があります。インターフェイスはビルド時に認識され、変更されません。使用される正確な実装は異なりますし、事前にどのモジュールがそれを提供しているのか分かりません。唯一の保証は、彼らがインターフェースを提供することです。クラス名とモジュール(DLL)は、設定ファイルから取得するか、プログラムによって変更することができます。
は今、私は比較的単純なシステムを使用して、現時点で設定しているすべての、(ちょうど基本を表示するには、書き換えられた擬似コード)そうのようなものを設定している:
struct ClassID
{
Module * module;
int number;
};
class Module
{
HMODULE module;
function<void * (int)> * createfunc;
static Module * Load(String filename);
IObject * CreateClass(int number)
{
return createfunc(number);
}
};
class ModuleManager
{
bool LoadModule(String filename);
IObject * CreateClass(String classname)
{
ClassID class = AvailableClasses.find(classname);
return class.module->CreateObject(class.number);
}
vector<Module*> LoadedModules;
map<String, ClassID> AvailableClasses;
};
モジュールは、いくつか持っていますそれらが提供するクラスの数およびそれらの名前/ IDを与えるためにエクスポートされた関数を呼び出す。すべてのクラスは、仮想デストラクタを持ち、ソースモジュールを格納し、クラスのID、それが実装するインタフェースなどを取得するいくつかのメソッドを持っています。IObject
から派生しています。
唯一の問題は、各モジュールを手動でどこかにロードする必要があることです(現時点では設定ファイルにリストされています)。私はこれを明示的に行うことを避けたいと思います(ModuleManager
の中で、その実装方法について本当に心配していません)。
モジュールの読み込みを処理せずに、オブジェクトを作成して(それがすべて設定されると)、魔法のように表示されます。
これは、COMが何らかの方法で行うことになっていると似ていると思います。私は簡単にCOMシステムを調べましたが、それは信じられないほどの余計なことです。私は自分のシステム内で知られているクラスだけが必要で、それが扱う他のすべての機能を必要とせず、どこかから来るインターフェースを実装するだけです。
私の他のアイデアは、レジストリを使用して、既知の/登録されたすべてのクラスとそのソースモジュールと番号を保持しているため、それらを検索するだけで、Manager::CreateClass
が魔法のようにオブジェクトを見つけて作成するように見えます。これは実行可能な解決策のように思えますが、最適か、何かを再構築しているかどうかはわかりません。
だからこそ、私の質問は次のとおりです。これはどのように処理するのですか?既存の技術はありますか?それを自分で設定するにはどうすればいいですか?私が探していなければならないものはありますか?
コンパイラやランタイムを気にすることなく、C#モジュールの使用を許可するなど、COMが提供する機能のいくつかはかなりいいですが、COMでこの作業を行う方法についての情報はまだ見つかりません。私が新しいインターフェース/オブジェクトを作る際に見つけることができたのは、多くの定義済みの定型コードでした。見栄えの良いドキュメントに関する提案はありますか? – ssube
私はCOMオブジェクトを作成するためのATLを見ていたと思います。私はDon Boxの本、Essential COMも読んでいます。実際には最初の2つの章だけが必要です。それは本当に恐ろしいことではありません! –
この本には、どのように動作するかについての良い説明があります。また、MSDNドキュメントの中には、素敵なチュートリアル用のものがあります。これを試して、それがうまくいくかどうかを見に行く。提案していただきありがとうございます。 :) – ssube