Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
pusheax
744
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 разрядной?

Alexey Viktorov
17835
Alexey Viktorov  
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
28774
Vasiliy Sokolov  
pusheax:

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

...

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

Модуль ex5 содержит сразу обе версии кода (32 битную и 64 битную). Поэтому едва ли причиной отказа в работе стал переход на 64 разрядную версию. Скорее всего просто терминал сильно обновился и Ваш ex5 просто перестал в нем работать.
pusheax
744
pusheax  
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
1214
Ilyas  
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(...)


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

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

Никак. Только во времени  исполнения.
pusheax
744
pusheax  

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

#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
22742
Stanislav Korotky  
if(TerminalInfoInteger(TERMINAL_X64)) trans_new_x64::ConnectionADO(...);
else trans_new_x32::ConnectionADO(...);
"я так думаю"
pusheax
744
pusheax  
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&) ?

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