Похоже баг. Dll + тип Bool

 
Хай, all!

  Пишу DLL на Delphi.
  library
  ...
  procedure DatabaseDebugModeEnabled(Enabled:LongBool);stdcall;
  begin
     DebugLog('DebugModeEnabled'+IntToStr(Ord(Enabled)));
  end;
  ...
  export
    DatabaseDebugModeEnabled;
  ...

  В mqh-файле прототип функции описан как:
 #import "ExpertBase.dll"
   void DatabaseDebugModeEnabled(bool Enabled);
 #import

  При вызове из скрипта:
  DatabaseDebugModeEnabled(True); //в логе DebugModeEnabled0 - то есть, Enabled = false
  DatabaseDebugModeEnabled(False);//в логе DebugModeEnabled0 - то есть, Enabled = false

  если вместо bool в прототипе написать int:
 #import "ExpertBase.dll"
   void DatabaseDebugModeEnabled(int Enabled);
 #import
  DatabaseDebugModeEnabled(1); //в логе DebugModeEnabled1 - то есть, Enabled = true
  DatabaseDebugModeEnabled(0); //в логе DebugModeEnabled0 - то есть, Enabled = false

  Я так понимаю, это какая-то проблема с передачей параметра типа bool.

Заранее спасибо
 

bool в терминале на самом деле int. Думаю, 4-х байтный.

 
chv
 
  Ну, дык LongBool именно 4х-байтный тип. Документацию читал ;).
 

Сталкивались с аналогичной проблемой передачи типа bool из программы на С++ в MT4. До коликов смеялись :))))))

В итоге нашли 2 выхода:

Первый - замена типа bool типом int (1-true, 0 - false) ,но это неинтересно.

И второй - передача не самой переменной типа bool, а переменной после каких-либо простейших булевских преобразований, которые в конечном счете не изменят переменную.

У нас было неважно, что возвращается, поэтому возвращали инвертированное значение.

return !pData->Sync_enter;

И все нормально заработало :)))

 
favoritefx

И второй - передача не самой переменной типа bool, а переменной после каких-либо простейших булевских преобразований, которые в конечном счете не изменят переменную.

   Не очень понял решение. Пробовал:
bool TrueFunc() {   return (False); }  DatabaseDebugModeEnabled(!TrueFunc());
DatabaseDebugModeEnabled((1==1));
int i = 10;  DatabaseDebugModeEnabled((i==10)); 
  Ни одно решение, кроме замены на параметр int не работает.
 
Может в Delphi это не работает?
 
favoritefx

Вряд ли. Если в прототипе mql меняешь bool на int, то работает, Delphi код я при этом не трогаю.  На уровне машинного кода LongBool и Integer равноценны.
Причина обращения: