Новая версия MetaTrader 4 Client Terminal build 418 - страница 4

 

Кто мешает подойти к вопросу без спешки и выпустить один стабильный релиз?

Подобная суета с билдами и все новые баги говорят, извините, о не профессионализме исполнителей. Бардак.

 

Обновился до 418 билда и столкнулся с такой проблемой:

- WinApi функция GetCurrentDirectory() выдает путь к рабочему столу.

В качестве альтернативы пытался использывать GetDllDirectory(), но она вообще возвращает пустую строку. И вот не знаю это ошибка или нам подрезали крылья ? ))

P.S: в 416-ом билде все было ОК.

 
VCup:

Не буду утверждать, но всегда считал что MT4 с stdcall не дружит, может так:

extern "C" __declspec(dllexport) double __cdecl fn()
   {
   } 
 
220Volt:

Не буду утверждать, но всегда считал что MT4 с stdcall не дружит, может так:

Зачем фантазировать? Есть пример от Метаквотов.
 
Zhunko:
Зачем фантазировать? Есть пример от Метаквотов.
Это не фантазии, голый личный опыт. Пример от Метаквотов никогда не видел. Все свои dll функции вызываю с __cdecl
 

Пример всегда лежал в этой папке: ...\MetaTrader 4\experts\samples

Всегда полезно ознакомиться с рекомендациями разработчиков.

 
Zhunko:

Пример всегда лежал в этой папке: ...\MetaTrader 4\experts\samples

Всегда полезно ознакомиться с рекомендациями разработчиков.

Да, пример нашел, ознакомился, но с разработчиками не согласен.

Код для С++:

extern "C" __declspec(dllexport) double __stdcall stdFn(double d1, double d2)
   {
   return(d1 + d2);
   } 

extern "C" __declspec(dllexport) double __cdecl cdFn(double d1, double d2)
   {
   return(d1 + d2);
   }

extern "C" __declspec(dllexport) int __stdcall stdFn2(double d1, double d2)
   {
   return(d1 + d2);
   } 

extern "C" __declspec(dllexport) int __cdecl cdFn2(double d1, double d2)
   {
   return(d1 + d2);
   } 

Код для MT:

#import "Test.dll"
double stdFn(double d1, double d2);
double cdFn(double d1, double d2);
int stdFn2(double d1, double d2);
int cdFn2(double d1, double d2);
#import
//+------------------------------------------------------------------+
//| script program start function                                      |
//+------------------------------------------------------------------+
int start()
  {
//----
                                          // ОЖИДАЕМЫЙ РЕЗУЛЬТАТ = 7 

                                          // у меня с stdcall вообще вылетает, даже без алерта 
     Alert("cdecl=",cdFn(4, 3));
     Alert("stdcall=",stdFn(4, 3));
     Alert("cdecl=",cdFn2(4, 3));
     Alert("stdcall=",stdFn2(4, 3));
     
//----
   return(0);
  }
//+------------------------------------------------------------------+
Легко можно поэксперементировать, и увидеть своими глазами. С возвратом double действительно проблема - возвращает -1.#IND
 

Да, а я вчера 4 часа бился головой о стол - почему не работает даже простая функция деления на число, и не возвращается double :D

однако в dll значения отсылаются, а обратно никак (хоть два int'а лепи)...

 
Та же самая ситуация, слетели все dll которые возвращают double. Заменил, где это возможно, на integer всё заработало. Убитый выходной. Представляю что будет происходить в понедельник, когда люди начнут торговать старыми dll в новом билде. Хорошо, если советники просто перестанут работать, хуже, как это было у меня, если начнут выдавать ложные сигналы. На будущее придётся делать какие-то защиты-проверки корректности возвращаемых значений, иначе можно конкретно попасть при очередной смене билда.
 
М-да. Напортачили-с. Та ж ботва, теперь и в индюке под линуксом -- сплошные 'dll call critical error <blah-blah-blah> at <blah-blah-blah>'. Откатил, восстановив весь каталог из архива, обновлялку переименовал в *.ex_, чтоб не дёргалась попусту, и перёшел на резервный вариант, с файлами, без длл. Под виндой и пробовать не буду, ибо и так очевидно. :) Ждём-с, когда до кучи сломают файловые операции. :)
Причина обращения: