Ayuda para resolver un problema con la importación de una función desde una dll - página 2

 

He escrito algo en un archivo h


extern __declspec( dllexport) int __stdcall GetIntValue(int);

entonces en el cpp sólo


int __stdcall GetIntValue(int)
 
Tal vez la palabra clave extern ayude.
 
alsu >> :

...


...y prefiero no lidiar con cuerdas en absoluto... ¿Por qué se necesitan en un dll? ¿Es sólo para la belleza?

Y la propia Borland recomienda utilizar char* o char[], al estilo de Metatrader, si es necesario.

 

Creo que la forma correcta de declararlo en el constructor es la siguiente (no recuerdo exactamente)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

Creo que es correcto declarar en el constructor algo así (no recuerdo exactamente)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

¡Allí! ¡Exactamente!

 

Muchas gracias por los consejos. Funcionó con este ejemplo después de extern "C" int __declspec(dllexport) __stdcall GetIntValue().

Lo he probado con funciones dobles y de cadena, y también ha funcionado. He decidido aplicar los conocimientos que he adquirido de ti a una tarea práctica. Pero, por desgracia... Por desgracia, no lo conseguí.

Si puedes, ayúdame una vez más.

Hay archivos en el proyecto Bilder para la creación de DLL: UHsvd.h, Usvd.cpp y otros.

El archivo UHsvd.h tiene una función que debe ser exportada posteriormente:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt);

El archivo Usvd.cpp contiene la misma función, que debe ser exportada:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt)

{

........

}

Empiezo a construir una DLL en Bilder en esta variante, todo "construye", todo funciona, sin errores.

Si empiezo a hacer cambios en UHsvd.h, Usvd.cpp como

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,

.....), entonces aparecen errores de 2 a 19 con diferentes variantes, es decir, hice esta declaración en el archivo de cabecera o en el cpp... aunque según tengo entendido debería estar en el archivo de cabecera (entonces sólo hay 2 errores):

[BCC32 Error] Usvd.cpp(128): E2356 Type mismatch in redeclaration of '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'
[BCC32 Error] UHsvd.h(111): E2344 Declaración anterior de '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'

Según tengo entendido, hay una discrepancia... Pero no lo entiendo del todo... :-(

Realmente espero su ayuda y apoyo...

 

boysn писал(а) >> {...}

Si puedes, por favor, ayuda una vez más.

Hay archivos en el proyecto Bilder para crear una DLL: UHsvd.h, Usvd.cpp y otros.

El archivo UHsvd.h tiene una función que debe ser exportada:

bool rmatrixsvd(ap::real_2d_array a,
int m,
n,
int no necesario,
int vtneed,
int memoria adicional,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}

Si he entendido bien, ap::real_1d_array es una clase. Y ap::real_1d_array & es una referencia a un objeto de clase.

Pero querida, sólo puedes pasar doble myData[] como parámetros a la Dll,

que se verá como doble * en las funciones.

 
jartmailru писал(а) >>

Si he entendido bien, ap::real_1d_array es una clase. Y ap::real_1d_array & es la referencia al objeto de clase.

Pero querida, sólo se puede pasar el doble myData[] a la Dll como parámetros,

que en las funciones se verá como doble *.

Estoy completamente de acuerdo con usted. Lo declararé como doble en MQL al importarlo. Pero actualmente estoy teniendo problemas para crear la DLL en sí en C++ Builder 2009. Me da errores al construirlo. Si no uso la declaración

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) entonces la compilación de la biblioteca en Bilder pasa sin problemas. Ahora, no sé cómo crear correctamente la declaración de las funciones de exportación en el proyecto Bilder :-(, para conseguir

DLL de trabajo con capacidad para exportar la función rmatrixsvd.

 
boysn >> :

Estoy totalmente de acuerdo con usted. Lo declararé como doble en MQL al importarlo. Pero por el momento estoy teniendo problemas para crear la DLL en sí en C++ Builder 2009. Me da errores al construirlo. Si no uso la declaración

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) entonces la biblioteca compila en Bilder con éxito, sin problemas. Ahora, no sé cómo crear correctamente la declaración de las funciones de exportación en el proyecto Bilder :-(, para conseguir

DLL de trabajo con capacidad para exportar la función rmatrixsvd.

Brrr. Parece que estás extrañamente de acuerdo conmigo.

.

En realidad se trata de escribir "adaptador" o "puente".

"Adaptador" desde el punto de vista de que los parámetros de la función exportada

debe coincidir con los parámetros que el metatrader puede pasar,

. es decir, necesitas una función extra que pase la llamada a donde quieres que vaya.

Y "puente" desde el punto de vista de que no es necesario para la función

que declare que hará el trabajo por sí mismo.

Y viceversa - no es necesario llamar a la función que hace el trabajo.

.

Es decir, hay que separar la interfaz y la implementación, es decir, la implementación puede construirse sobre clases

. y funciones que están fuera de la Dll que nadie conocerá.

.

Pero consideremos un ejemplo.

.

Deberías declarar la función así:

extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// por supuesto, también pasarás aquí el número de filas y columnas.

{

//convertir los parámetros de entrada en ap::real_2d_array

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ;

.

//calcular

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3);

.

//traducir el resultado de a3 a out

convertReal2DArrayToPDouble(a3, out);

.

volver;
}

.

Aquí - por supuesto - la función rmatrixsvd

no se declara como extern "C" o __stdcall o __declspec etc.

Porque es parte de la implementación interna y oculta.

 

Lo siento, no lo entendí del todo, por desgracia...

De http://alglib.sources.ru/ he descargado la implementación de C++ (código) que necesito. Si no le importa, eche un vistazo al archivo adjunto de 100KB. Este algoritmo tiene muchas funciones auxiliares, el número total de líneas de código es algo así como 3000 líneas... Yo creo que sí

Lo dice la página web, es decir, es demasiado, y es bastante difícil traducirlo a MQL... Hay que entender el propio algoritmo para traducirlo correctamente. Por el momento es un poco complicado para mí. Por eso me gustaría usar C++ Builder 2009 para hacer una dll con este código ya hecho y llamar a la función rmatrixsvd(...) que necesito desde la dll. Ahí es donde me quedé perplejo... dónde y cómo declararlo correctamente... Con este código, sin cambiar una línea allí, la DLL se construye, sin errores. Pero en cuanto pongo extern "C" bool __declspec(dllexport) __stdcall me da error...

Gracias por su tiempo.

Archivos adjuntos:
svdy1e.cpp.zip  94 kb
Razón de la queja: