Cómo crear una clase desde dll (constructor en dll)? (С ++) o cómo cargar dinámicamente la clase desde dll?Cómo crear una clase desde dll (constructor en dll)? (С ++)
Respuesta
Respondiendo a su pregunta en sentido estricto, es necesario agregar una función extern "C" que devuelve el resultado del constructor:
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
Luego, en su fuente se puede utilizar GetProcAddr en "new_foo" para llamar a la función .
Deberá exportar una función de la DLL que llama al constructor y devuelve el nuevo objeto.
Trate de evitar el uso de tipos concretos de C++ como parámetros de función; La idea de las DLL es que usted puede actualizarlas independientemente, pero un compilador actualizado puede diseñar std :: string de manera diferente, causando incompatibilidad en el tiempo de ejecución.
Esto es lo que está en la raíz de COM, por ejemplo, un sistema de tipo limitado y una función exportada estándar para obtener instancias de objetos.
Parece que la fuente de la DLL no está bajo su control. –
fuente DLL está bajo mi control – SomeUser
Si la clase está destinada a ser utilizada, entonces probablemente ya debe ser compilada con __declspec (dllexport), entonces solo es cuestión de convencer al archivo de encabezado para poner __declspec (dllimport) en el definición de clase. De lo contrario, siempre puede modificar el archivo de encabezado usted mismo. – JesperE
Debe declarar su clase utilizando la palabra clave __declspec(dllexport)
al compilar la DLL. Cuando se utiliza el archivo DLL, la clase debe ser declarada con __declspec(dllimport)
:
#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif
class DECLSPEC_CLASS MyClass
{
...
}
Cuando se compila el DLL, se debe añadir -DCOMPILING_DLL a la lista de los define.
Al utilizar la clase, debe vincular estáticamente con la DLL, es decir, pasar la biblioteca de importación mydll.lib al programa principal.
Si desea cargar la DLL en tiempo de ejecución, necesita tener una función C en la DLL que crea un objeto y lo devuelve. No hay forma de buscar un constructor dinámicamente en una DLL (usando GetProcAddress()).
En lugar de exportar todos los métodos de la clase utilizando declspec, también se puede confiar en el hecho de que el compilador puede invocar funciones virtuales a través de la viable, así por ejemplo:
//note: no __declspec
class IPublicInterface
{
virtual ~IPublicInterface() = 0;
virtual void SomeMethod() = 0;
};
//note: no __declspec
class SomeClass : IPublicInterface
{
virtual ~SomeClass() { ... }
virtual void SomeMethod() { ... }
};
//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
return new SomeClass();
}
interfaz/patrón de fábrica es bueno, especialmente si va a utilizar 'GetProcAddress' y gestiona manualmente .def exportaciones tabla –
Dado que la memoria está asignada en la DLL, tal vez también debería haber una' freeSomClass (IPublicInterface *) 'solo para asegúrese de que la memoria se libera correctamente? – Robert
Creo que esta respuesta es incorrecta y debería eliminarse. No se puede pasar un objeto polimórfico a través de un límite de plugin, excepto cuando se usa el mismo compilador en el plugin y la aplicación. –
- 1. Referencia a una DLL desde otra DLL
- 2. cómo acceder a una clase desde un dll en python?
- 3. ¿Cómo usar una clase en DLL?
- 4. Cómo crear una DLL con SWIG desde Visual Studio 2010
- 5. Cómo crear DLL ActiveX en Visual C++
- 6. ¿Cómo exportar una clase de C++ desde un dll?
- 7. ¿Puedo separar un dll grande en 1 dll por clase?
- 8. Importación dinámica de una clase de C++ desde una DLL
- 9. Obteniendo el nombre de una DLL desde el dll
- 10. Fusiona varias DLL nativas en una DLL
- 11. Carga dinámicamente una función desde una DLL
- 12. cortar una clase de control DLL
- 13. Interfaz de complemento C++ DLL
- 14. Cómo crear una DLL que se usará en C#
- 15. .NET - ¿Cómo depurar una DLL?
- 16. ¿Puedes llamar a una DLL de C desde una DLL de C?
- 17. crear un archivo dll en C#
- 18. ¿La clase base pura debe exportarse desde DLL?
- 19. Usando Windows DLL desde Linux
- 20. Cómo crear archivos dll en matlab y usar estos dll en aplicaciones .Net
- 21. una DLL, varios proyectos?
- 22. Llamar a los métodos DLL desde Javascript
- 23. Poner la serialización de una clase en una DLL
- 24. clase de C++ DLL en C# Aplicación
- 25. С ++ Implementación de la clase `Timer`
- 26. Cómo llamar a una DLL .NET desde un proceso Win32?
- 27. ¿Puede una DLL llamar a una DLL .NET?
- 28. Cómo utilizar NLog para una DLL
- 29. Llamar a C# dll desde Delphi
- 30. funciona desde una llamada dll la misma función de nombre de otra dll
¿Tiene un archivo de cabecera coincidente y/o archivo de biblioteca para acceder al dll? –
sí, tengo mi encabezado y fuentes – SomeUser