Ich habe eine DLL, die auf Daten zugreifen muss, die in STL-Containern in der Host-Anwendung gespeichert sind. Da C++ keine Standard-ABI hat und ich verschiedene Compiler unterstützen möchte, muss die Schnittstelle zwischen der Anwendung und der DLL im Grunde einfach-alte-Daten bleiben.Wie stellt man die STL-Liste über die DLL-Grenze frei?
Für Vektoren ist dies relativ einfach. Sie können einfach den Speicherblock des Vektors zurückkehren, weil es garantiert contigious sein:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
Nun ist die DLL kann sicher Nur-Lese-Zugriff auf die Daten des Vektors über diese Schnittstelle. Die DLL kann dies auch so umschließen, dass sie den Inhalt für sich selbst in einen Vektor kopiert.
Was ist jedoch mit STL-Listen (und Deques)? Gibt es einen anderen direkten Weg, um den Zugriff über eine DLL-Grenze zu ermöglichen? Oder muss ich auf eine Art GetFirst()/GetNext() Schnittstelle zurückgreifen? Ich könnte das für viele Listen tun müssen, also wäre es nett, eine Lösung so einfach wie Vektoren zu haben.
Sie haben Recht, dass ich damit durchkommen könnte, wenn alle Kompilierungseinstellungen gleich sind. Aber das ist für eine Plugin-Architektur und ich würde gerne verschiedene Compiler unterstützen. Ich habe die Frage bearbeitet, um dies zu klären. – AshleysBrain
Dem stimme ich zu, aber vielleicht sollten Sie betonen, dass es nicht nur das Layout ist - der Code muss mit der gleichen Version des Compilers kompiliert worden sein, damit Implementierungen von Methoden wie new und delete übereinstimmen. –
Wenn Sie Build-Einstellungen/Compiler-Versionen streng erzwingen und alles unter Ihrer Kontrolle steht, was ist dann der Vorteil von DLLs im Vergleich zur Verwendung von statischen Bibliotheken und der Verknüpfung von allem zu einer ausführbaren Datei? –