2008-09-21 14 views
13

¿Cuál es la forma correcta de importar una clase de C++ desde una DLL? Estamos usando Visual C++.Importación dinámica de una clase de C++ desde una DLL

Hay 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?

Respuesta

2

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í está un ejemplo práctico, exporting an MFC document/view from a DLL, carga dinámicamente

1

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

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 sea mucho más rápido cargar).

Obviamente eso es para la compilación de 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, puedes escribir el nombre completamente destrozado y funcionaría.

Las soluciones provisionales 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 una DLL que se utilizan para obtener los métodos de interfaz dentro del objeto en la DLL .

12

es necesario agregar lo siguiente:

extern "C" 
{ 
... 
} 

para evitar la mutilación de la función.

se podría considerar escribir dos funciones simples C:

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

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

utilizando sólo aquellas funciones que se pueden agregar después/funcionalidad de cambio de la creación/supresión de objetos. Esto a veces se llama una fábrica.

+1

¿No deberían estos nombres 'SomeClass' tener asteriscos (es decir, ser punteros a' SomeClass')? –

2

Salida this question. 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ó

Cuestiones relacionadas