Pregunta

¿Cuál es la forma correcta de importar una clase de C++ desde un archivo DLL?Estamos usando Visual C++.

Hay la dllexport/exportaciones.def+LoadLibrary+GetProcAddress trifecta, pero no funciona en las clases de C++, C funciones.Es esto debido a que C++ nombre-destrozarlo?¿Cómo puedo hacer este trabajo?

¿Fue útil?

Solución 2

Encuentra la solución en http://www.codeproject.com/KB/DLL/XDllPt4.aspx

Gracias por sus esfuerzos chicos & chicas

Otros consejos

Deberá agregar la siguiente:

extern "C"
{
...
}

para evitar función de destrozarlo.

usted podría considerar la posibilidad de escribir dos simples funciones de C:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

Por el sólo uso de las funciones que puede después añadir/cambiar la funcionalidad de su objeto de creación/eliminación.Esto a veces se llama una Fábrica.

Yo normalmente declarar una interfaz de la clase base, el uso de esta declaración en mi aplicación, a continuación, utilizar la función LoadLibrary y GetProcAddress para obtener la fábrica de la función.El factor de siempre devuelve un puntero del tipo de interfaz.

He aquí un ejemplo práctico, la exportación de una MFC documento/vista desde un archivo DLL, dinámicamente cargado

Echa un vistazo esta pregunta.Básicamente, hay dos maneras.La marca de clase utilizando _dllexport y, a continuación, enlace con la biblioteca de importación, y la DLL se carga automáticamente.O si desea cargar la DLL de forma dinámica a ti mismo, usted puede usar la fábrica función de la idea de que @titanae sugerido

dllexport/dllimport las obras, lugar antes de que el nombre de su clase en el archivo de encabezado y ya está bueno para ir.

Normalmente, usted desea utilizar dllexport en la dll, y dllimport en el archivo exe (pero puedes usar dllexport en todas partes y obras, haciendo de 'derecho' hace tinily más rápido para la carga).

Obviamente que es para el enlace en tiempo de compilación.Usted puede utilizar /delayload enlazador directiva para hacerlo 'dinámico', pero que probablemente no es lo que quieres de la línea de asunto.

Si usted realmente quiere un LoadLibrary estilo de carga, vas a tener que ajustar sus funciones de C++ con extern "C" wrappers.El problema radica en nombre de planchado, usted podría escribir en el totalmente destrozado nombre y que iba a trabajar.

Las soluciones son generalmente para proporcionar una función de C que devuelve un puntero a la clase correcta - COM funciona de esta manera, ya que las exportaciones 4 C funciones de una dll que se utilizan para obtener los métodos de interfaz en el interior del objeto en el archivo dll.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top