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

 

Здравствуйте! Не подскажите как на уровне компилятора определить какая версия 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 разрядной?

 
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

 
pusheax:

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

...

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

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

Как это сделать?
 
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(...)


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

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

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

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

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

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