La fonction de chaîne DLL ne fonctionne pas sur le Build 600 - page 2

 
gchrmt4:

Simuler les anciens tableaux de chaînes Ansi est compliqué, mais toujours possible. (Cela va dépendre du bon comportement de la DLL, en particulier si elle renvoie des données à MQL4 en modifiant le contenu du tableau. Je n'ai testé cela que contre l'exemple de code C++ en bas de page, pas contre quelque chose de plus réaliste comme la bibliothèque MySql).

Par exemple, le code ci-dessus fonctionne avec la DLL suivante qui fait une boîte de message pour chaque chaîne dans un tableau, puis inverse la chaîne avant de la renvoyer à MT4 :


Je ne peux tout simplement pas expliquer à quel point vos extraits sont utiles. Merci beaucoup ! J'ai écrit un wrapper MySQL en MQL4 pur (pour la version UNICODE) qui communique avec libmysql.dll (ANSI) en utilisant les techniques que vous avez mentionnées et celles que j'ai trouvées dans la bibliothèque MySQL d'EAX (MQL5).

J'apprécierais vraiment que vous jetiez un coup d'oeil à mon code et que vous me fassiez part des choses à améliorer ou que vous y contribuiez, car je suis certain qu'il peut être amélioré.

 

gchrmt4,

Pouvez-vous me montrer comment je peux faire passer une chaîne de caractères par un appel de fonction DLL, ou m'indiquer un exemple de code ?

Ce que je cherche est la confirmation que je peux faire un appel tel que :

#import

int call_a_string_function(string this_is_a_string) ;

#Importation

...

...

string foo1 = "ceci est une chaîne" ;

int retruncode = call_a_string_function(foo1) ;

alors à quoi ressemblerait le code C pour la fonction ci-dessus ? Je cherche simplement l'exemple de la routine.

Par exemple

int call_a_string_function(char *this_is_a_string) ;

etc

Certaines personnes disent qu'il faut utiliser un tableau ou un tableau de caractères, etc. Je cherche une clarification. Juste un simple échantillon sur la meilleure approche car vous avez mentionné la fuite de mémoire, etc.

salutations

gorick

 
gorick:

gchrmt4,

Pouvez-vous me montrer comment je peux faire passer une chaîne de caractères par un appel de fonction DLL, ou m'indiquer un exemple de code ?

Ce que je cherche est la confirmation que je peux faire un appel tel que :

#import

int call_a_string_function(string this_is_a_string) ;

#Importation

...

...

string foo1 = "ceci est une chaîne" ;

int retruncode = call_a_string_function(foo1) ;

alors à quoi ressemblerait le code C pour la fonction ci-dessus ? Je cherche simplement l'exemple de la routine.

Par exemple

int call_a_string_function(char *this_is_a_string) ;

etc

Certaines personnes disent qu'il faut utiliser un tableau ou un tableau de caractères, etc. Je cherche une clarification. Juste un simple échantillon sur la meilleure approche car vous avez mentionné la fuite de mémoire, etc.

salutations

gorick

Voir cet article https://www.mql5.com/en/articles/18
 

Oui, merci pour ça. C'est vraiment bien présenté et c'est ce que j'attendais. Cependant, je semble avoir des problèmes avec les chaînes de caractères.

J'ai créé un exemple de ce document en C, par exemple ci-dessous, pour accepter une valeur de chaîne en entrée et l'écrire dans un fichier :

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

J'écris les valeurs dans un fichier pour les vérifier.

Le MQL est le suivant :

 #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 sortie du fichier est la suivante :

Voici les valeurs des chaînes de caractères : R foooooooooooooooo1

Il ne renvoie que le "R" ou le premier caractère de la chaîne passée ? Le "foooooooooooo1" a été inséré juste pour vérifier que j'imprime correctement.

Quelqu'un a-t-il une idée de ce que je fais mal ?

 
gorick:

Oui, merci pour ça. C'est vraiment bien présenté et c'est ce que j'attendais. Cependant, il semble que j'aie des problèmes avec les chaînes de caractères.

J'ai créé un échantillon de ce document en C, par exemple ci-dessous, pour accepter une valeur de chaîne en entrée et l'écrire dans un fichier :

<removed>

Veuillez utiliser le bouton SRC pour poster le code . . .
 
gorick:

Quelqu'un a-t-il une idée de ce que je fais mal ?

Le problème se situe dans votre code C, pas dans MQL4.

%s dans printf() signifie "chaîne Ansi". Vous devez utiliser %ls

 
gorick:

Oui, merci pour ça. C'est vraiment bien présenté et c'est ce que j'attendais. Cependant, il semble que j'aie des problèmes avec les chaînes de caractères.

J'ai créé un exemple de ce document en C, par exemple ci-dessous, pour accepter une valeur de chaîne en entrée et l'écrire dans un fichier :

J'écris les valeurs dans un fichier pour les vérifier.

Le MQL est le suivant :

La sortie du fichier est la suivante :

Voici les valeurs des chaînes de caractères : R foooooooooooooooo1

Il ne renvoie que le "R" ou le premier caractère de la chaîne passée ? Le "foooooooooooo1" a été inséré juste pour vérifier que j'imprime correctement.

Quelqu'un a-t-il une idée de ce que je fais mal ?


Bonjour,

Veuillez utiliser le bouton SRC lorsque vous postez du code. Merci.


Cette fois, je l'ai édité pour vous.

 
angevoyageur:

Bonjour,

Veuillez utiliser le bouton SRC lorsque vous publiez un code. Merci.


Cette fois, je l'ai édité pour vous.


Désolé les gars, c'est la première fois que je poste ici.

Merci pour votre contribution, je vous en suis vraiment reconnaissant.

Ce que cela implique, c'est que tous les échantillons existants ne sont pas exacts. Il faut utiliser l'unicode. Comme je suis très novice en matière de programmation de DLL, j'ai commencé à partir de zéro tout récemment, et je me suis donc fortement appuyé sur les exemples fournis. De plus, il se trouve que j'ai commencé à utiliser la version 600 au même moment.

Si vous faites cela depuis longtemps, j'imagine que vous êtes parfaitement au courant de la situation. Ce n'est malheureusement pas le cas, je ne reçois que des bribes d'informations et de conseils sur ce forum.

Je m'excuse de mon ignorance.

Salutations et remerciements

 
Les gens,

Parce que vous m'avez tous aidé, je suis heureux de partager mon code, qui fait une connexion à Oracle DB.

Le problème est que le précompilateur Oracle Pro*C et oracle peuvent gérer l'unicode, mais il y a des limites à l'utilisation des constructions. Pour se connecter, les chaînes de caractères doivent être ascii. Vous trouverez ci-dessous le code permettant de se connecter à la base de données à partir d'un appel DLL.

Si quelqu'un a des suggestions sur ce qu'il faut faire de mieux, faites-le moi savoir.

Je vous remercie encore.

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:
Les gens,

Parce que vous m'avez tous aidé, je suis heureux de partager mon code, qui fait une connexion à Oracle DB.

Le problème est que le précompilateur Oracle Pro*C et oracle peuvent gérer l'unicode, mais il y a des limites à l'utilisation des constructions. Pour se connecter, les chaînes de caractères doivent être ascii. Vous trouverez ci-dessous le code permettant de se connecter à la base de données à partir d'un appel DLL.

Si quelqu'un a des suggestions sur ce qu'il faut faire de mieux, faites-le moi savoir.

Je vous remercie encore.

Merci beaucoup gorkk!