私は、多くのDLLで共有される基本抽象クラス(interface
)を継承しています。各DLLには、オブジェクトを動的に作成してそのポインタを返すエクスポートされたファクトリシンボルがあります。 2つの異なるDLLが同じ抽象クラスから継承された同じ名前のクラスを持っているとどうなりますか? obj1
とobj2
を意味dllを介したC++クラスの衝突
class foo
{
public:
virtual void func()const=0;
};
DLL1
class bar: public foo
{
public:
virtual void func()const{
std::cout << "From Dll1" << std::endl;
}
};
DLL2
class bar: public foo
{
public:
virtual void func()const{
std::cout << "From Dll2" << std::endl;
}
};
メイン
int main()
{
foo* obj1;
foo* obj2;
// load DLLs
// import factory
// call factory to initialize objects
obj1->func(); // output: "From Dll1"
obj2->func(); // output: "From Dll2"
return typeid(*obj1) == typeid(*obj2);
}
戻りtrue
は両方instanです同じ階級から派遣されました。同様にtypeid(*obj1).name()
とtypeid(*obj2).name()
は同じ名前class bar
を返します。 RTTI
を使用してこれらのオブジェクトを区別できる方法はありますか?DLL自体を制御することはできませんか?この場合、クラスにはUUID
を提供するメカニズムが必要ですか?
P.S. IInspectableは、オブジェクトを工場にマップできると述べています。しかし、もしインターフェイスがオブジェクトをコンパイルすることが許せば? DLLは、ファクトリについて認識していないため、異なるモジュールから返されたオブジェクトを区別することはありません。それが私がRTTI
を使用したい主な理由です。
* "import factory" *と言ったときは、すでに実装しているモジュールを提供する必要があります。関数ポインタとモジュールの間のマッピングを格納したくない場合は、[GetModuleHandleEx](https://msdn.microsoft.com/en-us/library)を呼び出して、いつでも関数ポインタからモジュールを取得できます。 /windows/desktop/ms683200.aspx)。 – IInspectable
@IInspectableあなたの返信をありがとう!私はモジュール間でオブジェクトを複合することができるようにしたいと考えています。特定の種類のオブジェクトのみを受け入れるために、派生クラスの実装にはいくつかの制約があります。 – Ivars
モジュールの境界を越えてCRTリソースを分散させることは、痛みの世界に入るための同義語です。あなたが得ることができるものですが、それは複雑さと勤勉さに関する親密な知識を必要とします。詳細については、[DLL境界を越えるCRTオブジェクトを渡す潜在的なエラー](https://msdn.microsoft.com/en-us/library/ms235460.aspx)を参照してください。あなたはCOMを再発明しているように見えますが、代わりにReal Thing™を使用してみませんか? – IInspectable