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

 
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 - это две ведущие компании, но стили написания исходников у них разные). 

 

Мы стараемся не выкладывать потенциально опасный код (DLL), чтобы лишний раз не нервировать пользователей. К тому же это лишь тестовый пример.

К сожалению, под рукой нет Borland C++ компилятора. Попробуйте приспособить самостоятельно - там ведь меньше одной страницы кода.

 

yu-sha:

Не слишком ли высокие цели ставят себе разработчики?

И зачем изобретать велосипед, если уже давным-давно все сделано (C, Delphi, ...)? 

Абсолютно согласен. Мне бы, например, для полного счастья, хватило хорошо продуманного COM интерфеса или, в рамках существующей стратегии развития в сторону FXRobot Developer Studio ;-), хотя бы, возможности предачи указателя на MQL5 Call Back функцию в DLL. Возможно я ошибаюсь, но сложилось впечатление, что пока можно экспортировать функции только для внутреннего употребления. Мне кажется, надо спуститься на землю и понять, что MT, как среда разработки никогда не приблизится к Borland Delphi (Embarcadero RAD Studio), Visual Studio и многим другим. И дело не в таланте разработчиков, а в огромных ресурсах, необходимых для разработки современной IDE. Я уже не говорю о гигантской поддержки упомянутых платформ со стороны сторонних производителей и прочих вещах. В первую очередь, хотелось бы видеть усилия разработчиков по созданию совершенного пользовательского интерфейса, штатного функционала и возможности использовать MQL для реализации моста между программами пользователя и сервером, где программы на MQL будут выполнять роль драйвера. Поймите меня правильно, я не хочу отнять любимую игрушку у начинающих программистов, но мне кажется, что надо уделить немного больше внимания профессиональным программистам и трейдерам, желающим получить совершенное готовое решение, а не конструктор "Сделай сам".
 

Надо делать не то, что кажется правильным, а то, что выгодно. Потому что выгодность - это и есть правильность. А в данном случае (MT5+MQL5+сервисы) - это колоссальная выгода (окупится в десятки-сотни раз) для MetaQuotes и огромная выгода для трейдеров. Только не сразу.

Всегда полезно посмотреть широко и вперед на, как минимум, 5 лет. MetaQuotes это сделали. 

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