Скачать MetaTrader 5

Отличить MQL x32 от x64

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск в документации доступен через MetaTrader 5. Ищи и изучай!
pusheax
746
pusheax 2016.11.24 11:12 

Здравствуйте! Не подскажите как на уровне компилятора определить какая версия 32 или 64 разрядная MT5?

Для определения MT4 или MT5 я делаю так:


#ifdef __MQL5__
      #ifdef _DEBUG
         Print("Hello from MQL5 compiler [DEBUG]");
      #else
        
#ifdef _RELEASE
           Print("Hello from MQL5 compiler [RELEASE]");
        #endif
    
#endif
  
#else
      
#ifdef __MQL4__
         #ifdef _DEBUG
           Print("Hello from MQL4 compiler [DEBUG]");
        #else
          
#ifdef _RELEASE
              Print("Hello from MQL4 compiler [RELEASE]");
           #endif
        
#endif
    
#endif
  
#endif

и тогда для переноса из МТ4 в МТ5 достаточно поменять расширение.

Теперь из-за перехода на 64 разрядную (x32 у меня просто перестала работать и вылетает с ошибкой) нужно отличать 32 от 64 разрядной?

Alexey Viktorov
6932
Alexey Viktorov 2016.11.24 12:13  
pusheax:

Здравствуйте! Не подскажите как на уровне компилятора определить какая версия 32 или 64 разрядная MT5?

Для определения MT4 или MT5 я делаю так:


#ifdef __MQL5__
      #ifdef _DEBUG
         Print("Hello from MQL5 compiler [DEBUG]");
      #else
        
#ifdef _RELEASE
           Print("Hello from MQL5 compiler [RELEASE]");
        #endif
    
#endif
  
#else
      
#ifdef __MQL4__
         #ifdef _DEBUG
           Print("Hello from MQL4 compiler [DEBUG]");
        #else
          
#ifdef _RELEASE
              Print("Hello from MQL4 compiler [RELEASE]");
           #endif
        
#endif
    
#endif
  
#endif

и тогда для переноса из МТ4 в МТ5 достаточно поменять расширение.

Теперь из-за перехода на 64 разрядную (x32 у меня просто перестала работать и вылетает с ошибкой) нужно отличать 32 от 64 разрядной?

int  TerminalInfoInteger(
   int  property_id      // идентификатор свойства
   );

с идентификатором TERMINAL_X64

Vasiliy Sokolov
21810
Vasiliy Sokolov 2016.11.24 12:19  
pusheax:

Здравствуйте! Не подскажите как на уровне компилятора определить какая версия 32 или 64 разрядная MT5?

...

Теперь из-за перехода на 64 разрядную (x32 у меня просто перестала работать и вылетает с ошибкой) нужно отличать 32 от 64 разрядной?

Модуль ex5 содержит сразу обе версии кода (32 битную и 64 битную). Поэтому едва ли причиной отказа в работе стал переход на 64 разрядную версию. Скорее всего просто терминал сильно обновился и Ваш ex5 просто перестал в нем работать.
pusheax
746
pusheax 2016.11.24 13:35  
Vasiliy Sokolov:
Модуль ex5 содержит сразу обе версии кода (32 битную и 64 битную). Поэтому едва ли причиной отказа в работе стал переход на 64 разрядную версию. Скорее всего просто терминал сильно обновился и Ваш ex5 просто перестал в нем работать.

1.Версия 1455 (х32) прекрасно работает, но стоит попробовать обновить при попытке запуска terminal.exe, metatester.exe, metaeditor.exe вылетает с ошибкой поэтому перешел на 64-х разрядную.

2.В MT5 в 32 и 64 используются разные DLL типа:

#import "trans_new_x32.dll" (для x32)

#import "trans_new_x64.dll" (для х64)

и теперь мне нужно, чтобы компилятор в зависимости от разрядности подставлял либо 1- вариант либо 2-й.

Как это сделать?
Ilyas
1205
Ilyas 2016.11.25 08:51  
pusheax:

1.Версия 1455 (х32) прекрасно работает, но стоит попробовать обновить при попытке запуска terminal.exe, metatester.exe, metaeditor.exe вылетает с ошибкой поэтому перешел на 64-х разрядную.

2.В MT5 в 32 и 64 используются разные DLL типа:

#import "trans_new_x32.dll" (для x32)

#import "trans_new_x64.dll" (для х64)

и теперь мне нужно, чтобы компилятор в зависимости от разрядности подставлял либо 1- вариант либо 2-й.

Как это сделать?
ссылка

o_O:для вызова функций из виндовых (когда передаем в них указатели) - нашел.

благодаря контексту :: все решается аккуратно.


Yurich:

В импорте указываешь две одинаковые функции, только с разными параметрами(int/long). В программе в зависимости от разрядности 32/64 вызываешь соответствующую функцию.


например вот так:

#import "MemMap32.dll"
int MemRead(HANDLE32 hmem, int &v[], int pos, int sz, int &err); // чтение вектора v с указанной позиции pos размером sz
#import "MemMap64.dll"
int MemRead(HANDLE64 hmem, int &v[], int pos, int sz, int &err); // чтение вектора v с указанной позиции pos размером sz
#import

// переопределяем вызовы для контроля битности
int MemRead(HANDLE64 h, int &v[], int pos, int sz, int &error) { if (_IsX64) return(MemMap64::MemRead(h, v, pos, sz, error)); return(MemMap32::MemRead((HANDLE32)h, v, pos, sz, error));  }
в а коде вызываешь с явным :: контекстом.

::MemRead(...)


То есть мы не плодим имена функций, а делаем автоопределение битности и вызов правильной импортируемой.
Комбинатор
15931
Комбинатор 2016.11.25 09:11  
pusheax:

Здравствуйте! Не подскажите как на уровне компилятора определить какая версия 32 или 64 разрядная MT5?

Никак. Только во времени  исполнения.
pusheax
746
pusheax 2016.11.26 13:43  

Я ничего не понял, не могли-бы вы на моем конкретном примере написать что и куда?

#property tester_library "trans_new_x32.dll";//x32
#property tester_library "trans_new_x64.dll";//x64

#import "trans_new_x32.dll" //(для x32)
bool ConnectionADO(string&);
#import

#import "trans_new_x64.dll" //(для х64)
bool ConnectionADO(string&);
#import

int OnInit()
{
  Result = s_ado.S_ConnectionADO("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PathBase + BaseFileName + ";Persist Security Info=False");//(для x32)
  Result = s_ado.S_ConnectionADO("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + PathBase + BaseFileName + ";Persist Security Info=False");//(для x64)
}
Вот мой код сразу для двух вариантов x32 и х64.
Stanislav Korotky
17939
Stanislav Korotky 2016.11.26 17:21  
if(TerminalInfoInteger(TERMINAL_X64)) trans_new_x64::ConnectionADO(...);
else trans_new_x32::ConnectionADO(...);
"я так думаю"
pusheax
746
pusheax 2016.11.26 17:50  
Stanislav Korotky:
if(TerminalInfoInteger(TERMINAL_X64)) trans_new_x64::ConnectionADO(...);
else trans_new_x32::ConnectionADO(...);
"я так думаю"

Это я вроде понял, а как быть с описанием импортируемых функций

#import "trans_new_x32.dll" //(для x32)
bool ConnectionADO(string&);
#import

#import "trans_new_x64.dll" //(для х64)
bool ConnectionADO(string&);

#import

из какой DLL из верхней или из нижней будет вызываться функция ConnectionADO(string&) ?

Комбинатор
15931
Комбинатор 2016.11.26 18:14  
Вам же уже ответили. <имя длл>::<имя функции> для однозначного вызова
pusheax
746
pusheax 2016.11.26 18:23  
Комбинатор:
Вам же уже ответили. <имя длл>::<имя функции> для однозначного вызова
Спасибо, надо будет в понедельник проверить, просто офигеть, я не знал, что так вообще можно делать.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий