Микропатч ATcl.mqh

8 апреля 2024, 08:46
Maxim Kuznetsov
0
31

Для пользователей ATcl рекомендую добавить небольшой патч в ATcl.mqh (далее под катом)

Вследствии параноидальной борьбы MQ с библиотечными вызовами (с _putenv точно, а возможно и с другими), инициализация DLL не всегда проходит корректно

Для частичного обхода данной проблемы рекомендую внести коррекции в Include/ATcl/ATcl.mqh. 

В конструктор ATcl::ATcl (строка 507 файла), добавить строки обрамлённые #ifdef #endif :

ATcl::ATcl(bool safe=false) {
   interp=ATcl_CreateInterp(safe);
   /* Усилиями MQ, в некоторых билдах MetaTrader 
      инит DLL выполняется не полностью (часть функций ими запрещены)
      поэтому требуется коррекция при старте интерпретаторов
   */      
#ifdef __MQL5__   
   Eval("if { [ info exists ::env(ATCL_HOME) ] && ${::tcl_library} == \"C:/tcl${::tcl_patchLevel}/library\" } { \n\
      set errorInfo \"\" \n\
      set ::tcl_library $::env(ATCL_HOME)/lib/tcl${::tcl_version} \n\
      source -encoding utf-8 [ file join $::tcl_library init.tcl ] \n\
      if { ! [ info exists ::env(PYTHON_HOME) ] } { \n\
         set ::env(PYTHON_HOME) [ file join $::env(ATCL_HOME) \"Python\" ] \n\
      } \n\
   }");
#else
   Eval("if { [ info exists ::env(ATCL32_HOME) ] && ${::tcl_library} == \"C:/tcl${::tcl_patchLevel}/library\" } { \n\
      set errorInfo \"\" \n\
      set ::tcl_library $::env(ATCL32_HOME)/lib/tcl${::tcl_version} \n\
      source -encoding utf-8 [ file join $::tcl_library init.tcl ] \n\
      if { ! [ info exists ::env(PYTHON_HOME) ] } { \n\
         set ::env(PYTHON_HOME) [ file join $::env(ATCL_HOME) \"Python\" ] \n\
      } \n\
   }");
#endif    
   Set("MetaTrader(DataDir)",TerminalInfoString(TERMINAL_DATA_PATH));
   Set("MetaTrader(CommonDir)",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
   Set("MetaTrader(TerminalPath)",TerminalInfoString(TERMINAL_PATH));
   Set("MetaTrader(TerminalName)",TerminalInfoString(TERMINAL_NAME));
   Set("MetaTrader(ProgramName)",MQLInfoString(MQL_PROGRAM_NAME));
   Set("MetaTrader(ProgramPath)",MQLInfoString(MQL_PROGRAM_PATH));
   Eval("set MetaTrader(ProgramDir) [ file dirname $MetaTrader(ProgramPath) ]");

В следующие версии ATcl этот патч обязательно войдёт, просто версию 1.10 буду выпускать не раньше чем через неделю (1.09 вчера пришлось срочно релизить)

Приношу извинения за то что ATcl засбоил на новых билдах MetaTrader