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

 
#import "MT4iQuickChannel.dll"
   int QC_StartSender(string);
   int QC_ReleaseSender(int);
   int QC_SendMessage(int SenderHandle, string Message, int Flags);
#import

#import "kernel32.dll"
   void OutputDebugStringW(string msg);
#import

extern string  ChannelName = "QuickChannelTest";
extern bool    LogMessagesToDbgView = true;
int glbHandle = 0;

void init()
{
   glbHandle = QC_StartSender(ChannelName);
   if (glbHandle == 0) {
      Alert("Failed to get a QuickChannel sender handle");
   }
}

void deinit()
{
   QC_ReleaseSender(glbHandle);
   glbHandle = 0;
}

void start()
{
   if (glbHandle != 0) {
      string strMsg = StringConcatenate("我的天哪"  ,TimeToStr(TimeLocal(), TIME_SECONDS), ": " , Symbol() , "," , DoubleToStr(Bid, MarketInfo(Symbol(), MODE_DIGITS)) , "," , DoubleToStr(Ask, MarketInfo(Symbol(), MODE_DIGITS)));
      if (LogMessagesToDbgView) OutputDebugStringW("Message " + strMsg);
      int result = QC_SendMessage(glbHandle, strMsg, 0);
      if (result == 0) Alert("QuickChannel message failed");
      printf(strMsg);
   }     
}   
#import "MT4iQuickChannel.dll"
   int QC_StartReceiver(string, int);
   int QC_ReleaseReceiver(int);
   int QC_GetMessages3(int, string & arr[], int);
#import

#import "kernel32.dll"
   void OutputDebugStringW(string msg);
#import

extern string  ChannelName = "QuickChannelTest";
extern bool    LogMessagesToDbgView = true;

int glbHandle = 0;
string glbReceiveBuffer = "";

void init()
{
   glbReceiveBuffer = "12345678";
   for (int i = 0; i < 4; i++) glbReceiveBuffer = StringConcatenate(glbReceiveBuffer, glbReceiveBuffer);   
}

void deinit()
{
   QC_ReleaseReceiver(glbHandle);
   glbHandle = 0;
}

void start()
{

   if (glbHandle == 0) {
      glbHandle = QC_StartReceiver(ChannelName, WindowHandle(Symbol(), Period()));
   
      if (glbHandle == 0) {
         Alert("Failed to get a QuickChannel receiver handle");
      }
   }

   if (glbHandle != 0) {
      string arrBuffer[1];
      arrBuffer[0] = StringConcatenate(glbReceiveBuffer, ""); // Use copy of buffer template
      int res = QC_GetMessages3(glbHandle, arrBuffer, StringLen(arrBuffer[0]));
      
      if (res == 2) {
         Alert("QuickChannel buffer is not large enough!");
                     
      } else if (res == 1) {
               
      } else {
         string strMsgList = arrBuffer[0];

         if (strMsgList != "") {
         
            string Messages[];
            StringSplit(strMsgList, "\t", Messages);
         
            for (int i = 0; i < ArraySize(Messages); i++) {
               string strMsg = Messages[i];

               if (LogMessagesToDbgView) OutputDebugStringW("..." + strMsg);
         
               Comment(strMsg);
               Print(strMsg);
 }  }  } }}   

void StringSplit(string InputString, string Separator, string & ResultArray[])
{
   ArrayResize(ResultArray, 0);
   
   int lenSeparator = StringLen(Separator), NewArraySize;
   while (InputString != "") {
      int p = StringFind(InputString, Separator);
      if (p == -1) {
         NewArraySize = ArraySize(ResultArray) + 1;
         ArrayResize(ResultArray, NewArraySize);      
         ResultArray[NewArraySize - 1] = InputString;
         InputString = "";
      } else {
         NewArraySize = ArraySize(ResultArray) + 1;
         ArrayResize(ResultArray, NewArraySize);      
         ResultArray[NewArraySize - 1] = StringSubstr(InputString, 0, p);
         InputString = StringSubstr(InputString, p + lenSeparator);
         if (InputString == "") {
            ArrayResize(ResultArray, NewArraySize + 1);      
            ResultArray[NewArraySize] = "";
 }  }  }}
Bonjour, codeurs, voici un exemple de message émetteur-récepteur de MT4iQuickChannel.dll, il fonctionne dans mt4 v509, mais pas dans v600+, je sais que le problème vient de l'unicode 16bit, mais je n'arrive pas à le résoudre, alors est-ce que tout le monde peut m'aider ?
 
C'est un code, installé dans deux MT, utilisé pour communiquer avec deux terminaux.
Dossiers :
 
appleparty:
Ceci est un code, à installer dans deux MT, à utiliser pour communiquer avec deux terminaux.

Merci beaucoup appleparty !
 

Vous êtes le bienvenu,le code ne fonctionne pas dans la version 600+, donc si vous pouvez nous dire comment résoudre le problème,i want thank you very much!.

 

@gorick :

Bon travail pour se connecter à une BD ORACLE ! Mais comment lire/écrire depuis/vers ORACLE avec mql4 ?

Et où avez-vous obtenu oraDLL.dll ?


Merci d'avance !


Michael

 

J'ai les mêmes questions que m.mick :

Où puis-je télécharger oraDLL.dll et comment est implémentée la lecture et l'écriture avec ORACLE-DB ?

THX 4 pour m'aider !

 
m.mick:

@gorick :

Bon travail pour se connecter à une BD ORACLE ! Mais comment lire/écrire depuis/vers ORACLE avec mql4 ?

Et où avez-vous récupéré oraDLL.dll ?

Merci d'avance !

Michael

m.mick,

Ce que j'ai donné est un extrait de code utilisant le précompilateur Oracle Pro*C. C'est la même chose que pour l'EXEC SQL CONNECT. Regardez l'exemple ci-dessous. Vous écrivez le code puis vous le passez dans le précompilateur Oracle Pro*C qui produit du code C que vous compilez ensuite dans le cadre de votre DLL dans les appels de fonction. Pour ce faire, vous devez connaître Oracle, obtenir le logiciel Oracle DB et Client, y compris les précompilateurs. J'utilise Oracle depuis très longtemps et je le préfère à tous les autres, simplement parce que j'y suis habitué.

Bonne chance.

    EXEC SQL WHENEVER NOT FOUND DO sql_error("ORACLE error--\n");

    EXEC SQL SELECT 'Col1', 'Col2'
             INTO :stringrec INDICATOR :string_ind /* note insert into array variable */
             FROM    dual
             WHERE   :bindval1 = :bindval1
             AND     :string1 = :string1;

Le précompilateur Oracle Pro*C génère du code C à partir de ce qui précède pour interfacer Oracle en utilisant l'OCI - Oracle Call Interface, son API native.

 
gorick:

m.mick,

Ce que j'ai donné est un extrait de code utilisant le précompilateur Oracle Pro*C. C'est la même chose que pour l'EXEC SQL CONNECT. Regardez l'exemple ci-dessous. Vous écrivez le code puis vous le passez dans le précompilateur Oracle Pro*C qui produit du code C que vous compilez ensuite dans votre DLL dans les appels de fonction. Pour ce faire, vous devez connaître Oracle, obtenir le logiciel Oracle DB et Client, y compris les précompilateurs. J'utilise Oracle depuis très longtemps et je le préfère à tous les autres, simplement parce que j'y suis habitué.

Bonne chance.

Le précompilateur Oracle Pro*C génère du code C à partir de ce qui précède pour interfacer Oracle en utilisant l'OCI - Oracle Call Interface, son API native.


J'ai oublié de mentionner que vous aurez besoin de la version 32 bits de l'Oracle Instant Client, que vous trouverez ici : http://www.oracle.com/technetwork/topics/winsoft-085727.html, la version 64 bits ne fonctionnera pas avec la plateforme MetaTrader. La DB peut être la version 64 bits. Vous devez connaître Oracle, c'est un logiciel complexe. Vous pouvez développer gratuitement, il vous suffit de créer un enregistrement auprès d'Oracle, l'enregistrement est gratuit. Tous les téléchargements d'Oracle sont gratuits.
 

gorick :

Oui, vous avez raison, ORACLE est un logiciel complexe. J'ai travaillé avec ORACLE depuis quelques années (mais seulement SQL et PL/SQL), c'est la meilleure base de données. Malheureusement, je n'ai pas développé avec le compilateur Pro*C ou les DLL. Il est donc assez difficile pour moi de le faire. Mais je vais essayer ! :-)

J'ai quelques questions concernant votre excellent travail.

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

Si j'essaie de le compiler (Build 610), je reçois des messages d'erreur comme "arrays are passed by reference only". Pourquoi ? Et que dois-je faire ? Pourquoi avoir utilisé uchar[] et non string ? Peut-être à cause du compilateur Pro*C ?

Comment avez-vous développé la DLL ? Avec MT4 aussi ? Je reçois un fichier *.ex4-File après la compilation dans l'éditeur méta.... .

Si je reçois le fichier .c du précompilateur Pro*C, que dois-je faire avec ce fichier ? Comment puis-je développer ou générer une DLL avec ce morceau de code ?


Oracle Instant Client est obligatoire pour chaque client sur lequel l'oraDLL doit être utilisé. N'est-ce pas ?


Merci d'avance !!!

 

Si j'utilise le compilateur ORACLE Pro*C, j'obtiendrai de nombreuses erreurs après avoir inséré le code généré dans la dll.

Voici quelques problèmes après la compilation de la dll :

- La déclaration de UNAME_LEN, PWD_LEN et DBSTRING_LEN est manquante.

- EXPORT est le bon mot, je vais avoir une erreur ; extern n'est pas le bon mot ?

- connect1 (et 2 et 3) sont de types différents : dans la déclaration char ** et l'utilisation (strncpy) seulement char * ; et c'est déprécisé, vous devriez utiliser strncpy_s

- sqlca n'est pas déclaré

- ...


Quelqu'un peut-il m'aider ?


THX par avance,

Michael