Tengo una DLL que necesita acceder a los datos almacenados en contenedores STL en la aplicación de host. Debido a que C++ no tiene ABI estándar, y quiero admitir diferentes compiladores, la interfaz entre la aplicación y la DLL básicamente tiene que seguir siendo plain-old-data.Cómo exponer la lista STL sobre el límite de DLL?
Para los vectores, esto es relativamente sencillo. Puede devuelva el bloque de memoria del vector, ya que se garantiza que sea contigious:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
Ahora la DLL puede tener acceso de lectura seguro a los datos del vector a través de esa interfaz. La DLL también puede ajustar esto para copiar el contenido en un vector para sí mismo también.
¿Qué pasa con las listas de STL (y deques) though? ¿Hay alguna otra manera directa de permitir el acceso a través de un límite de DLL? ¿O tendré que recurrir a algún tipo de interfaz GetFirst()/GetNext()? Puede que tenga que hacer esto para muchas listas, por lo que sería bueno tener una solución tan simple como la de los vectores.
Tiene razón de que podría salirse con la suya si todos los ajustes de compilación son los mismos. Pero esto es para una arquitectura de complementos y me gustaría admitir diferentes compiladores. He editado la pregunta para aclarar esto. – AshleysBrain
Estoy de acuerdo con esto, pero tal vez deberías enfatizar que no es solo el diseño: el código debe haberse compilado con la misma versión del compilador, de modo que las implementaciones de métodos como nuevo y eliminar coincidan. –
Si aplica estrictamente las configuraciones de compilación/versiones de compilador y todo está bajo su control, ¿cuál es la ventaja de las DLL frente a usar bibliotecas estáticas y vincular todo en un solo ejecutable? –