Ayuda para resolver un problema con la importación de una función desde una dll

 

Quiero aprender a importar funciones desde la dll. He probado diferentes variantes, pero sigue saliendo el siguiente error: no se puede llamar a la función desde la dll (error 127).

1. He intentado compilar mi proyecto en C++ Builder 6.

2. el mismo proyecto en C++ Builder 2009.

3. He creado un proyecto a partir del ejemplo DLLSample en C++ Builder 2009, lo he compilado.

El mismo resultado en todas partes: no se puede llamar a la función desde la dll (error 127).

Para probarlo, utilizo el script con PExpDll.dll - biblioteca compilada en C++ Builder 2009 del ejemplo DLLSample, que viene con MetaTrader 4.

Aquí está este guión:

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#enlace de la propiedad "https://www.metaquotes.net//"

#importar "PExpDll.dll"
int GetIntValue(int);
double GetDoubleValue(double);
cadena GetStringValue(cadena);
#importar

//+------------------------------------------------------------------+
//| función de inicio del programa de script |
//+------------------------------------------------------------------+
int inicio()
{
//----
Print("Inicio de la secuencia de comandos");
GetStringValue("Me pregunto si esto funcionará");
GetIntValue(10);

//----
return(0);
}
//+------------------------------------------------------------------+

Por favor, ayúdeme, dígame qué estoy haciendo mal...

Gracias de antemano.

 

Opción 1) averiguar dónde poner el archivo def. Sin ella, probablemente no llegarás a ninguna parte.

Opción 2) instalar Visual Studio

 

LOL

opción 3:

hay probadores, al menos de VB excel - comprueba que se llama a la función solicitada.

Si no - mala configuración del enlazador, sí - no es un error en la descripción del MQL

Con la instalación de MT4, se entrega una buena DLL de código C - utilícela para el entrenamiento, le ahorrará mucho tiempo.

 
boysn >> :

#importar "PExpDll.dll"
int GetIntValue(int);
double GetDoubleValue(double);
cadena GetStringValue(cadena);
#importar

Según las reglas de declaración de funciones en MQL-4, tienes un claro error:

int GetIntValue(int X);
double GetDoubleValue(double X);
string GetStringValue(string X);

No hay nombre de parámetro de entrada, sólo tipo. Esto no está permitido en MQL-4.

 
Urain >> :

Según las reglas de declaración de funciones en MQL-4, hay un error flagrante:

No hay nombre de parámetro de entrada, sólo tipo. En MQL-4 no está permitido.

Lo que el compilador no jura, lo puedes hacer tú.

Intenté escribirlo así:

#import "timeService.dll"
// функция, выдающее смещение от Utc 
// до времени сервера и до локального времени
int timeService(
  string , //  <--- убрал имя переменной
  int & utcToServer[],
  int & utcToLocal[]  );
#import

Todo funciona bien.

En realidad, según los cánones de C y C++, no es necesario especificar los nombres de los parámetros en absoluto.

Además, en la mayoría de los casos el programador está ocupado sentándose y comentando.

 

Muchas gracias por sus consejos, gracias por responder.

1. En MT4 tengo marcada la opción Service-Settings-Advisors-Confirm call of dll functions. Entonces, cuando ejecuto el script, me pregunta si debo llamar a dicha función... Selecciono "Sí" y a continuación aparece un error: no se puede llamar a la función desde la dll (error 127).

2. Qué pasa con las declaraciones de funciones sin parámetros como double GetDoubleValue(double), está escrito así en los ejemplos, sobre todo porque el compilador no se queja de ello, así que está bien.

3. Pero qué pasa con el archivo def... Claro, tal vez sea por el archivo def, pero realmente no sé dónde ponerlo. En los proyectos de C++ Builder 6 y 2009 no existen estos archivos con dicha extensión, es decir, al construir la propia dll no parece haber ningún sitio donde ponerla. En la misma carpeta bajo el mismo nombre en \MetaTrader 4\\Nla carpeta de bibliotecas no es la misma... lo probé... En resumen, no está claro. He intentado otro ejemplo en el que se utiliza una dll del sistema ya hecha

#importar "kernel32.dll"
int _lopen (string path, int of);
int _lcreat (string path, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle);
#importar

Estas funciones se llaman. El motivo de DLLSample no está claro.
Si la razón está en el Linker, ¿qué puede ser? Parece que estoy haciendo el archivo independiente.

Eh... sí... no lo entiendo. ¿El ejemplo en MT4 funciona con seguridad? ¿Alguien ha comprobado si funciona?

Gracias a todos por responder y contestar.

 
¿Cómo se le pasan parámetros de cadena y se da el resultado en el mismo tipo? Bilder tiene peculiaridades cuando se trata de cadenas...
 
boysn >> :

{...} 3. En cuanto al archivo def... Por supuesto, puede ser por eso, pero no está claro dónde ponerlo. En los proyectos de C++ Builder 6 y 2009 no existen estos archivos con esta extensión, es decir, al construir la propia dll no parece haber ningún lugar donde pegarla. En la misma carpeta bajo el mismo nombre en \MetaTrader 4\\Nla carpeta de bibliotecas no es la misma... lo probé... En resumen, no está claro. He intentado otro ejemplo que utiliza una dll de sistema ya hecha {...}

Estas funciones se llaman... El motivo de DLLSample no está claro.
Si la razón está en el enlazador, ¿qué podría ser? Parece que estoy haciendo el archivo independiente.

M... sí... no está claro. ¿El ejemplo en MT4 seguro que funciona? ¿Alguien lo ha probado para ver si funciona?

Gracias a todos por responder y contestar.

1) aunque el constructor es ejem... "ligeramente" equivocado, el archivo def sigue siendo necesario

2) ¿Has probado a instalar Visual Studio?

3) el ejemplo funciona. constructor equivocado.

 
jartmailru >> :

1) a pesar de que el constructor es... "ligeramente" equivocado, el archivo def sigue siendo necesario

2) aún no has probado Visual Studio

3) el ejemplo funciona. constructor equivocado.

de hecho hice dlls para mt4 en bilder, def-file no era útil...

 
boysn >> :

Si Linker es la causa, ¿qué puede haber ahí? Me parece que el archivo es independiente.


¿puedes hacer una captura de pantalla de las pestañas Compiler Linker y Packages de la configuración del proyecto?

 
alsu >> :

Solía hacer dlls para mt4 en dibilder, def-file no era útil...

Comparta un ejemplo con un colega :-).

Tal vez usted necesita para escribir algunos garabatos antes de la declaración de la función allí.

.

Y bilder... Todavía tengo una copia del 6 con 4 service packs.

Dejó de usarlo después de un caso curioso :-).

Cuando añado una función a un archivo .cpp, me salen todo tipo de fallos :-).

Los fallos consistían en que el constructor mentía los parámetros pasados a la función a través de la pila.

Si eliminas la función, todo vuelve a estar bien.

También puedo recordar las variables globales que son accesibles sólo desde un módulo,

donde se declaran, y del resto se ve basura :-).