La función de cadena DLL no funciona en la compilación 600 - página 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] = "";
 }  }  }}
Hola, codificadores, esto es MT4iQuickChannel.dll emisor-receptor ejemplo de mensaje, trabajó en mt4 v509, pero no funcionan en v600 +, sé que el problema es acerca de 16 bits unicode, pero no puedo resolverlo, así que todo el mundo puede ayudarme?
 
este es el código, instalar en dos MT, el uso de la comunicación con dos terminales.
Archivos adjuntos:
 
appleparty:
este es el código, instalar en dos MT, el uso para la comunicación con dos terminales.

¡Muchas gracias appleparty!
 

usted es bienvenido,el código no es trabajo en v600+, así que si usted puede decirnos cómo resolver el problema,quiero muchas gracias!

 

@gorick:

¡Gran trabajo para conectarse a una DB ORACLE! ¿Pero cómo se lee/escribe desde/a ORACLE con mql4?

¿Y de dónde has sacado oraDLL.dll?


Gracias por adelantado.


Michael

 

Tengo las mismas preguntas que m.mick:

¿Dónde puedo descargar oraDLL.dll y cómo es la implementación de la lectura y escritura con ORACLE-DB?

¡THX 4 que me ayude!

 
m.mick:

@gorick:

¡Gran trabajo para conectarse a una DB ORACLE! ¿Pero cómo se lee/escribe desde/a ORACLE con mql4?

¿Y de dónde sacaste oraDLL.dll?

Gracias por adelantado.

Michael

m.mick,

Lo que he dado es un fragmento de código usando el precompilador Oracle Pro*C. Lo mismo que el EXEC SQL CONNECT. Mira el ejemplo de abajo. Escribes el código y luego lo pasas por el precompilador de Oracle Pro*C que produce un código C que luego compilas como parte de tu DLL en las llamadas de función. Usted necesita saber Oracle, obtener la base de datos Oracle y el software del cliente, incluyendo los precompiladores para hacer esto. He estado usando oracle durante mucho tiempo y lo prefiero a todos los demás, simplemente porque estoy acostumbrado a él.

Buena suerte.

    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;

El precompilador Oracle Pro*C genera código C a partir de lo anterior para interactuar con Oracle utilizando la OCI - Oracle Call Interface, su API nativa.

 
gorick:

m.mick

Lo que he dado es un fragmento de código usando el precompilador Oracle Pro*C. Lo mismo que el EXEC SQL CONNECT. Mira el ejemplo de abajo. Escribes el código y luego lo pasas por el precompilador de Oracle Pro*C que produce un código C que luego compilas como parte de tu DLL en las llamadas de función. Usted necesita saber Oracle, obtener la base de datos Oracle y el software del cliente, incluyendo los precompiladores para hacer esto. He estado usando oracle durante mucho tiempo y lo prefiero a todos los demás, simplemente porque estoy acostumbrado a él.

Buena suerte.

El precompilador Oracle Pro*C genera código C a partir de lo anterior para interactuar con Oracle utilizando la OCI - Oracle Call Interface, su API nativa.


Olvidé mencionar que necesitarás la versión de 32 bits del Oracle Instant Client, que se encuentra aquí: http://www.oracle.com/technetwork/topics/winsoft-085727.html, la de 64 bits no funcionará con la plataforma MetaTrader. La base de datos puede ser la versión de 64 bits. Tienes que conocer Oracle, es un software complejo. Usted puede desarrollar de forma gratuita, sólo tiene que crear un registro con Oracle, es libre de registrarse. Todas las descargas de Oracle son gratuitas.
 

gorick:

Sí, tienes razón, ORACLE es un software complejo. He trabajado con ORACLE desde hace un par de años (pero sólo SQL y PL/SQL), es la mejor base de datos. Desafortunadamente no he desarrollado con Pro*C Compiler o DLL's. Así que es bastante difícil para mí, para hacer esto. ¡Pero lo voy a intentar! :-)

Tengo un par de preguntas con respecto a su gran trabajo.

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

Si intento compilarlo (Build 610), recibo mensajes de error como "los arrays se pasan sólo por referencia". ¿Por qué? ¿Y qué debo hacer? ¿Por qué has utilizado uchar[] y no string? ¿Tal vez por el compilador Pro*C?

¿Cómo has desarrollado la DLL? ¿También con MT4? Recibo un archivo *.ex4 después de compilar en meta editor.... .

Si recibo el archivo .c del precompilador Pro*C, ¿qué tengo que hacer con ese archivo? ¿Cómo puedo desarrollar o generar una DLL con ese trozo de código?


Oracle Instant Client es obligatorio para todos los clientes en los que se debe utilizar la oraDLL. ¿Verdad?


¡¡THX de antemano!!

 

Si utilizo el compilador ORACLE Pro*C, me salen muchos errores después de insertar el código generado en la dll.

Aquí hay algunos problemas después de compilar la dll:

- falta la declaración de UNAME_LEN, PWD_LEN y DBSTRING_LEN

- ¿es EXPORT la palabra correcta, me da error; no es extern la palabra correcta?

- connect1 (y 2 y 3) son de tipos diferentes: en la declaración char ** y en el uso (strncpy) sólo char *; y está deprisado, deberías usar strncpy_s

- sqlca no está declarado

- ...


¿Alguien puede ayudarme?


THX de antemano,

Michael