Строковая функция DLL не работает на Build 600 - страница 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] = "";
 }  }  }}
Привет, кодеры, это пример сообщения MT4iQuickChannel.dll отправитель-получатель, он работал в mt4 v509, но не работает в v600+, я знаю, что проблема в 16bit unicode, но я не могу решить ее, так что может ли каждый помочь мне?
 
это код, устанавливается в два MT, используется для связи с двумя терминалами.
Файлы:
 
appleparty:
это код, установите в два MT, используйте для связи с двумя терминалами.

Спасибо большое appleparty!
 

пожалуйста, код не работает в v600+, так что если вы можете сказать нам, как решить проблему, я хочу поблагодарить вас очень много!

 

@gorick:

Отличная работа по подключению к БД ORACLE! Но как читать/писать из/в ORACLE с помощью mql4?

И откуда вы взяли oraDLL.dll?


Заранее спасибо!


Майкл

 

У меня те же вопросы, что и у m.mick:

Где я могу скачать oraDLL.dll и как реализовано чтение и запись с ORACLE-DB?

Спасибо за помощь!

 
m.mick:

@gorick:

Отличная работа по подключению к БД ORACLE! Но как вы читаете/пишете из/в ORACLE с помощью mql4?

И откуда вы взяли oraDLL.dll?

Заранее спасибо!

Michael

m.mick,

То, что я привел, является фрагментом кода с использованием прекомпилятора Oracle Pro*C. То же самое, что и EXEC SQL CONNECT. Посмотрите на пример ниже. Вы пишете код, затем прогоняете его через прекомпилятор Oracle Pro*C, который производит C-код, который вы затем компилируете как часть вашей DLL в вызовах функций. Для этого вам нужно знать Oracle, получить программное обеспечение Oracle DB и Client, включая прекомпиляторы. Я использую Oracle уже очень долгое время и предпочитаю его всем другим, просто потому что привык к нему.

Удачи.

    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;

Прекомпилятор Oracle Pro*C генерирует код на языке Си для взаимодействия с Oracle, используя OCI - Oracle Call Interface, его родной API.

 
gorick:

m.mick,

То, что я привел, является фрагментом кода с использованием прекомпилятора Oracle Pro*C. То же самое, что и EXEC SQL CONNECT. Посмотрите на пример ниже. Вы пишете код, затем прогоняете его через прекомпилятор Oracle Pro*C, который производит код на C, который вы затем компилируете как часть вашей DLL в вызовах функций. Для этого вам нужно знать Oracle, получить программное обеспечение Oracle DB и Client, включая прекомпиляторы. Я использую Oracle уже очень долгое время и предпочитаю его всем другим, просто потому что привык к нему.

Удачи.

Прекомпилятор Oracle Pro*C генерирует код на языке Си для взаимодействия с Oracle, используя OCI - Oracle Call Interface, его родной API.


Я забыл упомянуть, что вам понадобится 32-битная версия Oracle Instant Client, найденная здесь: http://www.oracle.com/technetwork/topics/winsoft-085727.html, 64-битная не будет работать с платформой MetaTrader. БД может быть 64-битной версии. Вы должны знать Oracle, это сложное программное обеспечение. Вы можете разрабатывать бесплатно, вам просто нужно создать регистрацию в Oracle, регистрация бесплатная. Все загрузки Oracle бесплатны.
 

Горик:

Да, вы правы, ORACLE - сложное программное обеспечение. Я работал с ORACLE несколько лет (но только с SQL и PL/SQL), это лучшая база данных. К сожалению, я не работал с Pro*C Compiler или DLL. Поэтому для меня это довольно сложно. Но я попробую! :-)

У меня есть пара вопросов по поводу вашей замечательной работы.

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

Если я пытаюсь скомпилировать его (Build 610), то получаю сообщения об ошибках типа "массивы передаются только по ссылке". Почему? И что мне делать? Почему вы использовали uchar[], а не string? Может быть из-за Pro*C-Compiler?

Как вы разрабатывали DLL? С MT4 также? Я получаю *.ex4-файл после компиляции в редакторе meta.... .

Если я получаю .c-файл от прекомпилятора Pro*C, что я должен делать с этим файлом? Как мне разработать или сгенерировать DLL с этим куском кода?


Oracle Instant Client является обязательным для каждого клиента, на котором должна использоваться oraDLL. Верно?


Заранее спасибо!!!

 

Если я использую ORACLE Pro*C Compiler, то после вставки сгенерированного кода в dll я получаю множество ошибок.

Вот некоторые проблемы после компиляции dll:

- отсутствует объявление UNAME_LEN, PWD_LEN и DBSTRING_LEN

- является ли EXPORT правильным словом, я получу ошибку; не является ли extern правильным словом?

- connect1 (и 2, и 3) имеют разные типы: в объявлении char **, а в использовании (strncpy) только char *; и он депривирован, нужно использовать strncpy_s

- sqlca не объявлен

- ...


Кто-нибудь может мне помочь?


Заранее спасибо,

Майкл

Причина обращения: