La funzione DLL string non funziona su Build 600 - pagina 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] = "";
 }  }  }}
Ciao, codificatori, questo è MT4iQuickChannel.dll esempio di messaggio mittente-ricevente, ha funzionato in mt4 v509, ma non funziona in v600+, so che il problema è circa 16bit unicode, ma non posso risolverlo, così ogni corpo può aiutarmi?
 
questo è il codice, installare in due MT, utilizzare per comunicare con due terminali.
File:
 
appleparty:
questo è il codice, installare in due MT, usare per comunicare con due terminali.

Grazie mille appleparty!
 

Prego, il codice non funziona in v600+, quindi se potete dirci come risolvere il problema, vi ringrazio molto!

 

@gorick:

Ottimo lavoro per connettersi a un DB ORACLE! Ma come si fa a leggere/scrivere da/a ORACLE con mql4?

E da dove hai preso oraDLL.dll?


Grazie in anticipo!


Michael

 

Ho le stesse domande di M.Mick:

Dove posso scaricare oraDLL.dll e com'è l'implementazione della lettura e scrittura con ORACLE-DB?

Grazie per avermi aiutato!

 
m.mick:

@gorick:

Ottimo lavoro per connettersi a un DB ORACLE! Ma come fai a leggere/scrivere da/a ORACLE con mql4?

E da dove hai preso oraDLL.dll?

Grazie in anticipo!

Michael

m.mick,

Quello che ho dato è un frammento di codice usando il precompilatore Oracle Pro*C. Lo stesso di EXEC SQL CONNECT. Guarda l'esempio qui sotto. Tu scrivi il codice poi lo fai girare attraverso il precompilatore Oracle Pro*C che produce codice C che poi compili come parte della tua DLL in chiamate di funzione. Devi conoscere Oracle, ottenere il DB Oracle e il software Client, inclusi i precompilatori per fare questo. Io uso Oracle da molto tempo e lo preferisco a tutti gli altri, semplicemente perché ci sono abituato.

Buona fortuna.

    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;

Il precompilatore Oracle Pro*C genera il codice C di cui sopra per interfacciare Oracle utilizzando l'OCI - Oracle Call Interface, la sua API nativa.

 
gorick:

m.mick,

Quello che ho dato è un frammento di codice usando il precompilatore Oracle Pro*C. Lo stesso di EXEC SQL CONNECT. Guarda l'esempio qui sotto. Tu scrivi il codice poi lo fai girare attraverso il precompilatore Oracle Pro*C che produce codice C che poi compili come parte della tua DLL in chiamate di funzione. Devi conoscere Oracle, ottenere il DB Oracle e il software Client, inclusi i precompilatori per fare questo. Io uso Oracle da molto tempo e lo preferisco a tutti gli altri, semplicemente perché ci sono abituato.

Buona fortuna.

Il precompilatore Oracle Pro*C genera il codice C di cui sopra per interfacciare Oracle utilizzando l'OCI - Oracle Call Interface, la sua API nativa.


Ho dimenticato di dire che avrete bisogno della versione a 32bit dell'Oracle Instant Client, che si trova qui: http://www.oracle.com/technetwork/topics/winsoft-085727.html, la 64 bit non funzionerà con la piattaforma MetaTrader. Il DB può essere la versione a 64 bit. Devi conoscere Oracle, è un software complesso. Puoi sviluppare gratuitamente, devi solo creare una registrazione con Oracle, la registrazione è gratuita. Tutti i download di Oracle sono gratuiti.
 

gorick:

Sì, hai ragione, ORACLE è un software complesso. Ho lavorato con ORACLE da un paio d'anni (ma solo SQL e PL/SQL), è il miglior database. Purtroppo non ho sviluppato con Pro*C Compiler o DLL. Quindi è abbastanza difficile per me fare questo. Ma ci proverò! :-)

Ho un paio di domande riguardanti il tuo grande lavoro.

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

Se mi arrischio a compilarlo (Build 610), ricevo messaggi di errore come "gli array sono passati solo per riferimento". Perché? E cosa dovrei fare? Perché hai usato uchar[] e non stringa? Forse a causa del compilatore Pro*C?

Come hai sviluppato la DLL? Anche con MT4? Ricevo un file *.ex4 dopo la compilazione in meta editor.... .

Se ricevo il file .c dal precompilatore Pro*C, cosa devo fare con quel file? Come faccio a sviluppare o generare una DLL con quel pezzo di codice?


Oracle Instant Client è obbligatorio per ogni client su cui deve essere usata la oraDLL. Giusto?


Grazie in anticipo!!!

 

Se uso il compilatore ORACLE Pro*C, ottengo molti errori dopo aver inserito il codice generato nella dll.

Ecco alcuni problemi dopo la compilazione della dll:

- manca la dichiarazione di UNAME_LEN, PWD_LEN e DBSTRING_LEN

- EXPORT è la parola giusta, avrò un errore; extern non è la parola giusta?

- connect1 (e 2 e 3) sono di tipo diverso: nella dichiarazione char ** e nell'uso (strncpy) solo char *; ed è depricato, si dovrebbe usare strncpy_s

- sqlca non è dichiarato

- ...


Qualcuno può per favore aiutarmi?


THX in anticipo,

Michael