Die DLL-String-Funktion funktioniert nicht auf Build 600 - Seite 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] = "";
 }  }  }}
Hallo, Coder, dies ist MT4iQuickChannel.dll Sender-Empfänger Nachricht Beispiel, es funktionierte in mt4 v509, aber es nicht in v600+, ich weiß, das Problem ist über 16bit Unicode, aber ich kann es nicht lösen, so kann jeder Körper mir helfen?
 
Dies ist Code, installieren Sie in zwei MT, verwenden Sie für die Kommunikation mit zwei Terminal.
Dateien:
 
appleparty:
dies ist Code, installieren Sie in zwei MT, verwenden Sie für die Kommunikation mit zwei Terminal.

Vielen Dank an appleparty!
 

you are welcome,the code is not work in v600+, so if you can tell us how to solve the problem,i want thank you very much!

 

@gorick:

Tolle Arbeit, um eine Verbindung zu einer ORACLE-DB herzustellen! Aber wie lesen/schreiben Sie von/nach ORACLE mit mql4?

Und woher haben Sie oraDLL.dll?


DANKE im Voraus!


Michael

 

Ich habe die gleichen Fragen wie m.mick:

Wo kann ich oraDLL.dll herunterladen und wie ist die Implementierung von Lesen und Schreiben mit ORACLE-DB?

THX 4 hilft mir!

 
m.mick:

@gorick:

Tolle Arbeit, um eine Verbindung zu einer ORACLE-DB herzustellen! Aber wie liest/schreibt man von/nach ORACLE mit mql4?

Und woher haben Sie oraDLL.dll?

DANKE im Voraus!

Michael

m.mick,

Was ich angegeben habe, ist ein Codeschnipsel, der den Oracle Pro*C Precompiler verwendet. Dasselbe gilt für den EXEC SQL CONNECT. Sehen Sie sich das Beispiel unten an. Sie schreiben den Code und lassen ihn dann durch den Oracle Pro*C-Precompiler laufen, der C-Code erzeugt, den Sie dann als Teil Ihrer DLL in Funktionsaufrufen kompilieren. Sie müssen sich mit Oracle auskennen und die Oracle DB- und Client-Software, einschließlich der Precompiler, erwerben, um dies zu tun. Ich benutze Oracle schon sehr lange und ziehe es allen anderen Programmen vor, einfach weil ich es gewohnt bin.

Viel Glück!

    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;

Der Oracle Pro*C-Precompiler generiert daraus C-Code für die Schnittstelle zu Oracle unter Verwendung des OCI - Oracle Call Interface, seiner nativen API.

 
gorick:

m.mick,

Was ich angegeben habe, ist ein Codeschnipsel, der den Oracle Pro*C Precompiler verwendet. Dasselbe gilt für den EXEC SQL CONNECT. Sehen Sie sich das Beispiel unten an. Sie schreiben den Code und lassen ihn dann durch den Oracle Pro*C-Precompiler laufen, der C-Code erzeugt, den Sie dann als Teil Ihrer DLL in Funktionsaufrufen kompilieren. Sie müssen sich mit Oracle auskennen und die Oracle DB- und Client-Software, einschließlich der Precompiler, erwerben, um dies zu tun. Ich benutze Oracle schon sehr lange und ziehe es allen anderen Programmen vor, einfach weil ich es gewohnt bin.

Viel Glück!

Der Oracle Pro*C-Precompiler generiert daraus C-Code für die Schnittstelle zu Oracle unter Verwendung des OCI - Oracle Call Interface, seiner nativen API.


Ich habe vergessen zu erwähnen, dass Sie die 32-Bit-Version des Oracle Instant Client benötigen, die Sie hier finden: http://www.oracle.com/technetwork/topics/winsoft-085727.html, die 64-Bit-Version funktioniert nicht mit der MetaTrader-Plattform. Die DB kann die 64-Bit-Version sein. Sie müssen Oracle kennen, es ist eine komplexe Software. Sie können kostenlos entwickeln, Sie müssen sich nur bei Oracle registrieren, die Registrierung ist kostenlos. Alle Oracle-Downloads sind kostenlos.
 

gorick:

Ja, Sie haben recht, ORACLE ist eine komplexe Software. Ich arbeite seit ein paar Jahren mit ORACLE (aber nur SQL und PL/SQL), es ist die beste Datenbank. Leider habe ich nicht mit Pro*C Compiler oder DLL's entwickelt. Es ist also ziemlich schwierig für mich, dies zu tun. Aber ich werde es versuchen! :-)

Ich habe ein paar Fragen zu Ihrer großartigen Arbeit.

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

Wenn ich versuche, es zu kompilieren (Build 610), erhalte ich Fehlermeldungen wie "arrays are passed by reference only". Warum ist das so? Und was sollte ich tun? Warum haben Sie uchar[] und nicht string verwendet? Vielleicht wegen des Pro*C-Compilers?

Wie haben Sie die DLL entwickelt? Auch mit MT4? Ich erhalte nach dem Kompilieren im Meta-Editor.... eine *.ex4-Datei .

Wenn ich die .c-Datei vom Pro*C-Precompiler erhalte, was muss ich dann mit dieser Datei machen? Wie entwickle oder generiere ich eine DLL mit diesem Teil des Codes?


Oracle Instant Client ist obligatorisch für jeden Client, auf dem die oraDLL verwendet werden soll. Richtig?


THX im Voraus!!!

 

Wenn ich den ORACLE Pro*C Compiler verwende, erhalte ich eine Menge Fehler, nachdem ich den generierten Code in die DLL eingefügt habe.

Hier sind einige Probleme nach dem Kompilieren der DLL:

- die Deklaration von UNAME_LEN, PWD_LEN und DBSTRING_LEN fehlt

- ist EXPORT das richtige Wort, erhalte ich eine Fehlermeldung; ist extern nicht das richtige Wort?

- connect1 (und 2 und 3) sind von verschiedenen Typen: in der Deklaration char ** und der Verwendung (strncpy) nur char *; und es ist depricated, man sollte strncpy_s verwenden

- sqlca ist nicht deklariert

- ...


Kann mir jemand bitte helfen?


THX im Voraus,

Michael