tipos - Importación dinámica de una clase C++ desde una DLL
tipos de librerias en c++ pdf (5)
¿Cuál es la forma correcta de importar una clase C ++ desde una DLL? Estamos usando Visual C ++.
Está el dllexport / exports.def + LoadLibrary + GetProcAddress trifecta, pero no funciona en las clases C ++, solo en las funciones C. ¿Esto se debe al cambio de nombre de C ++? ¿Cómo hago que esto funcione?
Encontré la solución en http://www.codeproject.com/KB/DLL/XDllPt4.aspx
Gracias por su esfuerzo chicos y chicas
Normalmente declaro una clase base de interfaz, uso esta declaración en mi aplicación, luego uso LoadLibrary, GetProcAddress para obtener la función de fábrica. El factor siempre devuelve el puntero del tipo de interfaz.
Aquí hay un ejemplo práctico, exportando un documento / vista de MFC desde una DLL , cargada dinámicamente
dllexport / dllimport funciona, colóquelo antes del nombre de su clase en el archivo de encabezado y listo.
Normalmente desea utilizar dllexport en el dll y dllimport en el exe (pero puede usar dllexport en todas partes y funciona, hacerlo "bien" hace que cargue mucho más rápido).
Obviamente, eso es para la compilación en tiempo de enlace. Puede usar / delayload linker directive para hacerlo ''dinámico'', pero probablemente no sea lo que quiere de la línea de asunto.
Si realmente desea cargar un estilo LoadLibrary, tendrá que ajustar sus funciones C ++ con envoltorios "extern C". El problema es que debido al cambio de nombre, podrías escribir el nombre completamente destrozado y funcionaría.
Las soluciones son generalmente para proporcionar una función C que devuelve un puntero a la clase correcta - COM funciona de esta manera, ya que exporta 4 funciones C de un dll que se utilizan para obtener los métodos de interfaz dentro del objeto en el dll.
Necesita agregar lo siguiente:
extern "C"
{
...
}
para evitar la función de manipulación.
podrías considerar escribir dos funciones C simples:
SomeClass* CreateObjectInstace()
{
return new SomeClass();
}
void ReleaseObject(SomeClass* someClass)
{
delete someClass;
}
Al usar solo esas funciones, puede agregar / cambiar la funcionalidad de la creación / eliminación de objetos. Esto a veces se llama una fábrica.
Mira esta pregunta . Básicamente, hay dos formas. Puede marcar la clase con _dllexport y luego vincular con la biblioteca de importación, y la DLL se cargará automáticamente. O si desea cargar la DLL de forma dinámica usted mismo, puede utilizar la idea de función de fábrica que @titanae sugirió