Обсуждение статьи "Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?" - страница 6

 
joo:
В общем, мне не удалось повысить скорость вычислений с помощью dll более чем в 2.5 раза. Это говорит о высокой скорости MQL5, и для большинства трейдерских задач нет смысла гемороится с dll, за исключением случаев, когда необходимо защитить код, и когда необходимы "тяжёлые" вычисления.

Еще не включена финальная регистровая оптимизация MQL5 - скорость исполнения еще серьезно повысится.
 

Ренат, спасибо за статью. Думаю многим она не раз пригодиться. У меня же попутный вопрос связанный с dll. (Терминал 249, редактор 248)

Пример

Имеем либру demo.dll, в ней всего одна функция

_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;}

 Имеем mql скрипт demo.mq5

#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#import "demo.dll"
void demo(string s1, string &s2);
#import

void OnStart(){
   string a="TEST"; string b;
   demo(a,b);
   Print(b);    
}

Компилятор не выдает ни ошибок, ни предупреждений.

Запускаем в терминале, получаем следующее

 

При проверке в визул дебуге обнаружил еще что в саму функцию demo.dll приходит не строка а ее первый символ.

Вопрос 

В чем проблема? Как по-человечески передать строку из MQL в dll?

 
Используйте wchar_t вместо char
 
GarF1eld:
Используйте wchar_t вместо char

wchar_t уже проходили, не помогает. Проблема то кроется в самом mql.

 
_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;}

Что это за код? Копирование указателя - это всего лишь копирование 4 байт памяти, содержащей адрес.

В этом случае Вам может помочь memcpy, если Вы заранее (в программе на MQL5) позаботитесь о распределении необходимого буфера в приёмной строке.

 
stringo:

Что это за код? Копирование указателя - это всего лишь копирование 4 байт памяти, содержащей адрес.

В этом случае Вам может помочь memcpy, если Вы заранее (в программе на MQL5) позаботитесь о распределении необходимого буфера в приёмной строке.

Да причем тут указатель то. Этот код прекрасно работает в mql4. C переходом на mql5 уже нет.

Тут все дают советы, но хоть бы один показал реально работающий пример как передать в dll функцию строку из mql5? 

 
antonix
:

...

Вопрос 

В чем проблема? Как по-человечески передать строку из MQL в dll?

1) Спасибо за сообщение. Ошибка исправлена. Ждите обновлений.

2) Вам правильно подсказали про wchar _t - строки в MQL5 юникодные

3) Что значит "При проверке в визул дебуге"?

4)  Правильно использовать так:

//--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit(b,256);
//--- вызываем DLL функцию
demo("test",b);
//--- печатаем результат
Print(b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if(stream==NULL || buf==NULL) return;
   //--- максимум 256 символов
   wcsncpy(buf,stream,256);
  }
 

Спасибо вам за то что помогаете таким горе-программистам как я. :) Ваш пример внес определенную ясность в мою ситуацию.

Воспрянув духом, решил написать(а вось кому пригодиться)  функцию для конвертации строки из wchar_t  в старую добрую char.  Эта функция может понадобиться тем у кого в проектах очень много кода использует тип char. А поскольку MQL5 передает только wchar_t, то проще конвертнуть на входе чем переписывать пол кода dll.

 

char* w2char(wchar_t* str){
      unsigned int lenght = wcslen(str)+1;
      char* ansi = new char[lenght];
      wcstombs(ansi, str, lenght);
      return ansi;
}
 
antonix:

Спасибо вам за то что помогаете таким горе-программистам как я. :) Ваш пример внес определенную ясность в мою ситуацию.

Воспрянув духом, решил написать(а вось кому пригодиться)  функцию для конвертации строки из wchar_t  в старую добрую char.  Эта функция может понадобиться тем у кого в проектах очень много кода использует тип char. А поскольку MQL5 передает только wchar_t, то проще конвертнуть на входе чем переписывать пол кода dll.

 

DLL-функции, которые принимают строки в виде char *, конечно же принимают указатель на первый элемент массива типа char. То есть, при описании импорта таких функций в MQL5-программе надо использовать чаровский массив в качестве строкового параметра.

Для таких случаев мы предусмотрели функцию StringToCharArray, которая правильно конвертирует строки в национальном алфавите. Функция wcstombs не всегда это делает правильно.

 

Статья интересная и полезная.

1) То что прилагаются исходники - это круто. Хех, тока вот где же откомпилированная DLL? Понятно что Мегапрогеру её создать не проблема.

А если я не Мега и не прогер?! :)

2) В статье используется MS компилятор. А я с ним не дружу.:)  У меня BC++. Можно ли выложить исходники заточенные для него?

(ИМХО , наверное лучше сразу всегда выкладывать исходники для MS и BC - это две ведущие компании, но стили написания исходников у них разные).