La funzione DLL string non funziona su Build 600 - pagina 2

 
gchrmt4:

Simulare i vecchi array di stringhe Ansi è disordinato, ma ancora possibile. (Questo dipende dal fatto che la DLL si comporti bene, in particolare se passa i dati indietro a MQL4 alterando il contenuto dell'array. Ho testato questo solo contro l'esempio di codice C++ in basso, non contro qualcosa di più realistico come la libreria MySql).

Per esempio, il codice di cui sopra funziona con la seguente DLL che fa una casella di messaggio per ogni stringa in un array e poi inverte la stringa prima di tornare a MT4:


Non riesco proprio a spiegare quanto siano utili i vostri snippet. Grazie mille! Sono andato avanti e ho scritto un wrapper MySQL in puro MQL4 (per la versione UNICODE) che comunica con libmysql.dll (ANSI) usando le tecniche che hai menzionato e le tecniche che ho trovato nella libreria EAX MySQL (MQL5).

Apprezzerei molto se tu potessi dare un'occhiata al mio codice lì e farmi sapere le cose da migliorare o contribuire ad esso perché sono abbastanza sicuro che potrebbe essere migliorato.

 

gchrmt4,

Potete per favore mostrarmi come posso passare una stringa attraverso una chiamata di funzione DLL, o indicarmi qualche codice di esempio?

Quello che sto cercando è la conferma che posso fare una chiamata come:

#import

int call_a_string_function(string this_is_a_string);

#importare

...

...

stringa pippo1 = "questa è una stringa

int retruncode = call_a_string_function(pippo1);

allora come sarebbe il codice C per la funzione di cui sopra? Sto solo cercando un esempio di routine.

ad esempio

int call_a_string_function(char *this_is_a_string);

ecc

Alcune persone dicono di usare un array o un array di char ecc. Sto cercando qualche chiarimento. Solo un semplice esempio sull'approccio migliore come hai menzionato la perdita di memoria ecc.

saluti

gorick

 
gorick:

gchrmt4,

Potete per favore mostrarmi come posso passare una stringa attraverso una chiamata di funzione DLL, o indicarmi qualche codice di esempio?

Quello che sto cercando è la conferma che posso fare una chiamata come:

#import

int call_a_string_function(string this_is_a_string);

#importare

...

...

stringa pippo1 = "questa è una stringa

int retruncode = call_a_string_function(pippo1);

allora come sarebbe il codice C per la funzione di cui sopra? Sto solo cercando un esempio di routine.

ad esempio

int call_a_string_function(char *this_is_a_string);

ecc

Alcune persone dicono di usare un array o un array di char ecc. Sto cercando qualche chiarimento. Solo un semplice esempio sull'approccio migliore come hai menzionato la perdita di memoria ecc.

saluti

gorick

Vedi questo articolo https://www.mql5.com/en/articles/18
 

Sì, grazie per questo. Davvero ben presentato e quello che mi aspettavo. Tuttavia, sembra che io abbia problemi con le stringhe.

Ho creato un esempio da quel documento in C, ad esempio qui sotto, per accettare un valore di stringa come input e scriverlo in un file:

#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);
}

Scrivo i valori in un file per controllare.

MQL è il seguente:

 #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

L'output del file è il seguente:

Questi sono i valori delle stringhe: R foooooooooooo1

Restituisce solo la "R" o il primo carattere della stringa passata? Il "foooooooooooo1" è stato inserito solo per verificare che sto stampando correttamente.

Qualcuno ha un'idea di cosa sto sbagliando?

 
gorick:

Sì, grazie per questo. Davvero ben presentato e quello che mi aspettavo. Tuttavia, sembra che io abbia problemi con le stringhe.

Ho creato un esempio da quel documento in C, ad esempio qui sotto, per accettare un valore di stringa come input e scriverlo in un file:

<rimozione>.

Si prega di utilizzare il pulsante SRC per postare il codice . . .
 
gorick:

Qualcuno ha un'idea di cosa sto sbagliando?

Il problema è nel tuo codice C, non in MQL4.

%s in printf() significa "stringa Ansi". Devi usare %ls

 
gorick:

Sì, grazie per questo. Davvero ben presentato e quello che mi aspettavo. Tuttavia, sembra che io abbia problemi con le stringhe.

Ho creato un esempio da quel documento in C, ad esempio qui sotto, per accettare un valore di stringa come input e scriverlo in un file:

Scrivo i valori in un file da controllare.

MQL è il seguente:

L'output del file è il seguente:

Questi sono i valori delle stringhe: R foooooooooooo1

Restituisce solo la "R" o il primo carattere della stringa passata? Il "foooooooooooo1" è stato inserito solo per verificare che sto stampando correttamente.

Qualcuno ha un'idea di cosa sto sbagliando?


Ciao,

Per favore usa il tasto SRC quando posti il codice. Grazie.


Questa volta l'ho modificato per te.

 
angevoyageur:

Salve,

Per favore usa il tasto SRC quando posti il codice. Grazie.


Questa volta l'ho modificato per te.


Scusate ragazzi, sono davvero nuovo a postare qui.

Grazie per il tuo contributo, ti sono davvero grato.

Ciò che implica è che tutti gli esempi esistenti non sono accurati. Si deve usare l'unicode. Dato che sono molto nuovo nella programmazione delle DLL, ho iniziato da zero proprio di recente, quindi ho fatto molto affidamento sugli esempi forniti. Inoltre, mi è capitato di iniziare ad usare la build 600 nello stesso momento.

Se lo fate da molto tempo, immagino che siate completamente consapevoli della situazione. Io purtroppo non lo sono, ricevendo solo frammenti di informazioni e consigli in questo forum.

Mi scuso per la mia ignoranza.

saluti e grazie

 
Persone,

Poiché tutti voi mi avete aiutato, sono felice di condividere il mio codice, che fa una connessione al DB Oracle.

Il problema è che il precompilatore Oracle Pro*C e oracle possono gestire l'unicode, tuttavia ci sono limitazioni su dove i costrutti possono essere usati. Per effettuare il login, le stringhe devono essere ascii. Di seguito è riportato il codice per effettuare il login al DB da una chiamata DLL.

Se qualcuno ha qualche suggerimento su cosa fare meglio, fatemelo sapere.

Vi ringrazio ancora.

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:
Persone,

Poiché tutti voi mi avete aiutato, sono felice di condividere il mio codice, che fa una connessione al DB Oracle.

Il problema è che il precompilatore Oracle Pro*C e oracle possono gestire l'unicode, tuttavia ci sono limitazioni su dove i costrutti possono essere utilizzati. Per effettuare il login, le stringhe devono essere ascii. Di seguito è riportato il codice per effettuare il login al DB da una chiamata DLL.

Se qualcuno ha qualche suggerimento su cosa fare meglio, fatemelo sapere.

Vi ringrazio ancora.

Grazie mille gorkk!