La función de cadena DLL no funciona en la compilación 600 - página 2

 
gchrmt4:

La simulación de las antiguas matrices de cadenas Ansi es complicada, pero aún es posible. (Esto va a depender de que la DLL se comporte bien, particularmente si pasa datos de vuelta a MQL4 alterando el contenido del array. Sólo he probado esto contra el código C++ de ejemplo en la parte inferior, no contra algo más realista como la biblioteca MySql).

Por ejemplo, el código anterior funciona con la siguiente DLL que hace un cuadro de mensaje para cada cadena en un array y luego invierte la cadena antes de regresar a MT4:


No puedo explicar lo útiles que son tus fragmentos. Muchas gracias. He seguido adelante y he escrito un wrapper de MySQL en MQL4 puro (para la versión UNICODE) que se comunica con libmysql.dll (ANSI) utilizando las técnicas que has mencionado y las que he encontrado en la librería EAX MySQL (MQL5).

Te agradecería mucho que le echaras un vistazo a mi código y me dijeras las cosas que hay que mejorar o contribuir a él, ya que estoy bastante seguro de que se puede mejorar.

 

gchrmt4,

¿Puedes mostrarme cómo puedo pasar una cadena a través de una llamada a una función DLL, o indicarme algún código de ejemplo?

Lo que busco es la confirmación de que puedo hacer una llamada como

#importar

int llamar_una_cadena_función(cadena esto_es_una_cadena);

#importar

...

...

string foo1 = "esto es una cadena";

int retruncode = call_a_string_function(foo1);

entonces, ¿cómo sería el código C para la función anterior? Sólo estoy buscando el ejemplo de rutina.

Por ejemplo

int call_a_string_function(char *this_a_string);

etc

Algunos dicen que hay que usar un array o un array de char, etc. Estoy buscando alguna aclaración. Sólo un simple ejemplo sobre el mejor enfoque como usted ha mencionado la fuga de memoria, etc.

saludos

gorick

 
gorick:

gchrmt4,

¿Puedes mostrarme cómo puedo pasar una cadena a través de una llamada a una función DLL, o indicarme algún código de ejemplo?

Lo que busco es la confirmación de que puedo hacer una llamada como

#importar

int llamar_una_cadena_función(cadena esto_es_una_cadena);

#importar

...

...

string foo1 = "esto es una cadena";

int retruncode = call_a_string_function(foo1);

entonces, ¿cómo sería el código C para la función anterior? Sólo estoy buscando el ejemplo de rutina.

Por ejemplo

int call_a_string_function(char *this_a_string);

etc

Algunos dicen que hay que usar un array o un array de char, etc. Estoy buscando alguna aclaración. Sólo un simple ejemplo sobre el mejor enfoque como usted ha mencionado la fuga de memoria, etc.

saludos

gorick

Véase este artículo https://www.mql5.com/en/articles/18
 

Sí, gracias por eso. Realmente bien presentado y lo que esperaba. Sin embargo, parece que tengo problemas con las cadenas.

He creado un ejemplo de ese documento en C, por ejemplo, a continuación, para aceptar un valor de cadena como entrada y escribirlo en un archivo:

#define  WIN32_LEAN_AND_MEAN
#include <windows.h>

#define  EXPORT extern "C" __declspec (dllexport)

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
EXPORT void __stdcall GetStringValue(wchar_t *spar)
{
char abc[20];
strcpy(abc,"foooooooooooo1");
printf("GetStringValue \"%s\"\n",spar);
FILE *fp;
fp=fopen("fooerr.txt", "w");
fprintf(fp, "These are the string values: %s %s\n\n", spar, abc);
fclose(fp);
}

Escribo los valores en un archivo para comprobarlos.

El MQL es el siguiente:

 #property indicator_chart_window

#include <stderror.mqh>
#include <stdlib.mqh>

#import "myDLL.dll"

void GetStringValue(string instring);

#import

int init()
{

string instring = "Rick wrote this";

GetStringValue(instring);

return(0);
} // init

La salida del archivo es la siguiente:

Estos son los valores de la cadena: R foooooooooooo1

Sólo devuelve la "R" o primer carácter de la cadena pasada? El "foooooooooooo1" fue insertado sólo para comprobar que estoy imprimiendo correctamente.

¿Alguien tiene una idea de lo que estoy haciendo mal?

 
gorick:

Sí, gracias por eso. Realmente bien presentado y lo que esperaba. Sin embargo, parece que tengo problemas con las cadenas.

He creado un ejemplo de ese documento en C, por ejemplo, a continuación, para aceptar un valor de cadena como entrada y escribirlo en un archivo:

<suprimido>

Por favor, utilice el botón SRC para publicar el código . . .
 
gorick:

¿Alguien tiene una idea de lo que estoy haciendo mal?

El problema está en tu código C, no en MQL4.

%s en printf() significa "cadena Ansi". Necesitas usar %ls

 
gorick:

Sí, gracias por eso. Realmente bien presentado y lo que esperaba. Sin embargo, parece que tengo problemas con las cadenas.

He creado un ejemplo de ese documento en C, por ejemplo, a continuación, para aceptar un valor de cadena como entrada y escribirlo en un archivo:

Escribo los valores en un archivo para comprobarlo.

El MQL es el siguiente:

La salida del archivo es la siguiente:

Estos son los valores de la cadena: R foooooooooooo1

Sólo devuelve la "R" o primer carácter de la cadena pasada? El "foooooooooooo1" fue insertado sólo para comprobar que estoy imprimiendo correctamente.

¿Alguien tiene una idea de lo que estoy haciendo mal?


Hola,

Por favor, utilice el botón SRC cuando publique el código. Gracias.


Esta vez, lo he editado para ti.

 
angevoyageur:

Hola,

Por favor, utilice el botón SRC cuando publique el código. Gracias.


Esta vez, lo he editado para ti.


Lo siento chicos, realmente nuevo para publicar aquí.

Gracias por tu aportación, te lo agradezco mucho.

Lo que implica es que todas las muestras existentes no son precisas. Hay que usar unicode. Como soy muy nuevo en la programación de DLLs empecé desde cero hace poco, así que me basé mucho en los ejemplos dados. Además, resulta que empecé a usar la compilación 600 al mismo tiempo.

Si has estado haciendo esto durante mucho tiempo, me imagino que eres completamente consciente de la situación. Yo, por desgracia, no lo estoy, sólo recibo retazos de información y consejos en este foro.

Pido disculpas por mi ignorancia.

saludos y gracias

 
Gente,

Debido a que todos ustedes me han ayudado estoy feliz de compartir mi código, que hace una conexión a Oracle DB.

El tema es que el precompilador de Oracle Pro*C y oracle pueden manejar unicode, sin embargo hay limitaciones en el uso de las construcciones. Para iniciar sesión, las cadenas tienen que ser ascii. Abajo está el código para ingresar a la BD desde una llamada DLL.

Si alguien tiene alguna sugerencia sobre qué hacer mejor por favor hágamelo saber.

Se lo agradezco de nuevo.

EXPORT int  __stdcall oracle_connect(char *connect1[], char *connect2[], char *connect3[])
{
   EXEC SQL BEGIN DECLARE SECTION;
   VARCHAR     username[UNAME_LEN];  /* VARCHAR is an Oracle-supplied struct */
   varchar     password[PWD_LEN];    /* varchar can be in lower case also. */
   varchar     dbstring[DBSTRING_LEN];
   EXEC SQL END DECLARE SECTION;

   /* Connect to ORACLE--
    * Copy the username into the VARCHAR.
    * Set the length component of the VARCHAR.
    
    strncpy((char *) username.arr, connect1, UNAME_LEN);
    username.len = strlen((char *) username.arr);
    strncpy((char *) password.arr, connect2, PWD_LEN);
    password.len = strlen((char *) password.arr);
    strncpy((char *) dbstring.arr, connect3, DBSTRING_LEN);
    dbstring.len = strlen((char *) dbstring.arr);
        
        EXEC SQL WHENEVER SQLERROR DO return(sqlca.sqlcode);
        EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring; 

/*    printf("\n\nConnected to ORACLE as user: %s\n", username.arr); */

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

MQL4 code

#import "oraDLL.dll"
   int    oracle_connect(uchar user_name[], uchar user_pwd[], uchar db_service[]);
#import

extern string DBusername = "scott";
extern string DBpassword = "tiger";
extern string DBservice = "localhost/pdborcl";

int returncode;

int init()
{
  uchar user_name[], user_pwd[], db_service[];
  StringToCharArray(DBusername,user_name);
  StringToCharArray(DBpassword,user_pwd);
  StringToCharArray(DBservice,db_service);
  returncode = oracle_connect(user_name,user_pwd,db_service);
  Print("returncode = " + returncode);
}

 
gorick:
Gente,

Debido a que todos ustedes me han ayudado estoy feliz de compartir mi código, que hace una conexión a Oracle DB.

El tema es que el precompilador de Oracle Pro*C y oracle pueden manejar unicode, sin embargo hay limitaciones en el uso de las construcciones. Para iniciar sesión, las cadenas tienen que ser ascii. Abajo está el código para ingresar a la BD desde una llamada DLL.

Si alguien tiene alguna sugerencia sobre qué hacer mejor por favor hágamelo saber.

Se lo agradezco de nuevo.

¡Muchas gracias gorkk!