Ich habe eine Basis abstrakte Klasse (interface
), die über viele DLLs geteilt wird, um von ihm zu erben. Jede DLL hat ein exportiertes Factory-Symbol, das dynamisch ein Objekt erstellt und seinen Zeiger zurückgibt. Was passiert, wenn zwei verschiedene DLLs Klassen mit demselben Namen von derselben abstrakten Klasse geerbt haben?C++ Klasse Kollision über dll
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;
}
};
Haupt
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);
}
Returns true
obj1
und obj2
Bedeutung sind beide Instan aus der gleichen Klasse. Sowie typeid(*obj1).name()
und typeid(*obj2).name()
gibt den gleichen Namen class bar
zurück. Gibt es eine Möglichkeit, diese Objekte mit RTTI
zu unterscheiden, wenn ich DLLs nicht selbst steuern darf? Muss die Klasse einen Mechanismus haben, um ihren für diesen Fall bereitzustellen?
P.S. Wie IInspectable hat gesagt, Sie können Objekt zu seiner Fabrik zuordnen. Aber was ist, wenn die Schnittstelle es ermöglicht, Objekte zu kompilieren? DLL würde niemals zwischen Objekten unterscheiden, die von verschiedenen Modulen zurückgegeben werden, da sie sich nicht über die Fabrik im Klaren sind. Das ist der Hauptgrund, den ich gerne verwenden würde RTTI
.
Wenn Sie * "Import Factory" * sagen, müssen Sie das Modul, das es implementiert, bereits auf die eine oder andere Weise bereitstellen. Wenn Sie das Mapping zwischen Funktionszeigern und Modulen nicht speichern möchten, können Sie das Modul jederzeit aus dem Funktionszeiger abrufen, indem Sie [GetModuleHandleEx] (https://msdn.microsoft.com/en-us/library) aufrufen /windows/desktop/ms683200.aspx). – IInspectable
@Intspectable Danke für Ihre Antwort! Ich möchte in der Lage sein, Objekte aus mehreren Modulen zusammenzusetzen. In der abgeleiteten Klassenimplementierung könnten Einschränkungen bestehen, um nur Objekte bestimmter Art zu akzeptieren. – Ivars
Die Verbreitung von CRT-Ressourcen über Modulgrenzen hinweg ist gleichbedeutend mit dem Eintritt in eine Welt der Schmerzen. Es ist etwas, das Sie * richtig * machen können, aber es erfordert intime Kenntnis der Feinheiten und des furchtbaren Fleißes. Weitere Informationen finden Sie unter [Mögliche Fehler beim Übergeben von CRT-Objekten über DLL-Grenzen hinweg] (https://msdn.microsoft.com/de-de/library/ms235460.aspx).Während das alles so aussieht, als würden Sie COM neu erfinden, warum nicht stattdessen das Real Thing ™ verwenden? – IInspectable