Билд 241 и передача тика в dll. Изменилась структура?

 

Ситуация вот в чем: У меня есть dll, в которую передаю тики, вернее указатель на них, а в dll уже из указателя получаю аналогичную .NET структуру тика.

 #import "somedll.dll"

   void  SendTick(MqlTick&);

#import

_DLLAPI void __stdcall SendTick(HANDLE hTick)

{

MqlTick tick = (MqlTick)Marshal::PtrToStructure(IntPtr(hTick), MqlTick::typeid);

// . . .

}

 

 Сегодня при тестировании скрипта мт5 предложил обновиться, вот я и обновился. После обновления я не могу получить структуру тика по указателю. Вот теперь думаю может что-то изменили в структуре, или запретили подобную передачу хендлов в dll? или сам дурак? :)

 

В этом билде улучшали совместимость MQL5 с 64 битным кодом и внесли несколько ошибок при передаче сложных типов в DLL.

Завтра с утра исправим. Извините за ошибку.

 
Renat:

В этом билде улучшали совместимость MQL5 с 64 битным кодом и внесли несколько ошибок при передаче сложных типов в DLL.

Завтра с утра исправим. Извините за ошибку.

242 билд - та же ситуация. Подскажите где можно скачать 240 билд?
 

Мы проверяли передачу структуры MqlTick в dll и не обнаружили описываемой Вами проблемы.

Вы, кстати, не сказали, что означает "не могу получить структуру тика". Что же Вы получаете? 

 

У меня тоже в 241 и в 242 не работает код

#import "MT5DataServerDll.dll"
  bool StartServer (string host, string port);
  bool StopServer ();
  int  GetQuery (string& s);
  int  AddReplay (string s);
#import

 В 240 все ОК

Ниже часть кода dll на Delphi 

function StartServer(host:PWideChar; port:PWideChar) : boolean;  stdcall;
begin
...
end;

function StopServer() : boolean; stdcall;
begin
...
end;

procedure GetQuery(wc:PWideChar); stdcall;
begin
...
end;

procedure AddReplay(wc:PWideChar); stdcall;
begin
...
end;

 И по ходу дела еще вопрос )))

int  GetQuery (string& s); - передает ссылку на стринг

int  AddReplay (string s); - создает новый экземпляр стринга, копирует содержимое, передает ссылку, потом удаляет копию

Я правильно понимаю механизм?

Если да, тогда выгоднее передавать в "свои" функции стринги вот так "string& s" ?


Руководство по написанию DLL для MQL5 на Delphi
Руководство по написанию DLL для MQL5 на Delphi
  • 2010.05.26
  • Andrey Voytenko
  • www.mql5.com
Статья рассматривает механизм написания модудя DLL на популярном языке программирования ObjectPascal в среде разработки Delphi. Изложенный в статье материал ориентирован в первую очередь на начинающих программистов, решающих задачи, выходящие за рамки встроенного языка программирования MQL5, путем подключения внешних DLL модулей.
 
yu-sha:

У меня тоже в 241 и в 242 не работает код

Что такое "не работает код"? Вы можете привести более конкретные факты?
 
stringo:

Мы проверяли передачу структуры MqlTick в dll и не обнаружили описываемой Вами проблемы.

Вы, кстати, не сказали, что означает "не могу получить структуру тика". Что же Вы получаете? 

 Да, действительно, когда я начал перепроверять у меня получилось вот что: если передавать указатель на тик в функцию первым параметром, то конвертится без проблем, а если, например, третьим, то выкидывает исключение. Не могу сообразить почему так происходит, поэтому накидал демо-проект всего этого (в аттаче)

Для работы нужен .net framework 2.0 и vs 2008 для открытия проекта 

Файлы:
 
stringo:
Что такое "не работает код"? Вы можете привести более конкретные факты?

Мне сложно вычислить в чем именно проблема

В этом посте https://www.mql5.com/ru/forum/382/page3/#comment_2309 выкладывал dll + скрипт, которые работают в 240 и "не работают" в 241 и "по-другому не работают" в 242.

Я не знаю, что вы меняли в билдах, я не могу отдебагить длл, могу лишь подозревать, что проблема в передаче string (или в моем непонимании процесса передачи указателей).

Фактически не срабатывает вызов функции Delphi dll, которая открывает tcp-сокет

#import "MT5DataServerDll.dll"
  bool StartServer (string host, string port);
  bool StopServer ();
  int  GetQuery (string& s);
  int  AddReplay (string s);
#import

 

function StartServer(host:PWideChar; port:PWideChar) : boolean;  stdcall;
begin
...
end;

 В 241 билде скрипт крэшился с ошибкой памяти

В 242 этой ошибки уже нет, но сокет не открывается 

Добавлено:

Перекомпилировал dll таким образом, чтобы передаваемые стринги не участвовали в процессе старта

Все работает (билд 242)

Проблема локализована до "неверно передаю стринги из МТ5 в dll" 

 

 

Спасибо. Будем разбираться

 
stringo:

Спасибо. Будем разбираться

Билд 243 - все ОК

> И по ходу дела еще вопрос )))

> int  GetQuery (string& s); - передает ссылку на стринг

> int  AddReplay (string s); - создает новый экземпляр стринга, копирует содержимое, передает ссылку, потом удаляет копию

> Я правильно понимаю механизм?

> Если да, тогда выгоднее передавать в "свои" функции стринги вот так "string& s" ?

 

 
yu-sha:

> int  GetQuery (string& s); - передает ссылку на стринг

> int  AddReplay (string s); - создает новый экземпляр стринга, копирует содержимое, передает ссылку, потом удаляет копию

> Я правильно понимаю механизм?

> Если да, тогда выгоднее передавать в "свои" функции стринги вот так "string& s" ?

Да, абсолютно правильно. И создание копий очень дорогая функция.

Но если string s передается внутри MQL5 кода, то компилятор будет (еще не включено) анализировать состояние неизменности параметра и автоматически использовать передачу ссылки (string &s) вместо копии. Этот прозрачный механизм позволит автоматически экономить ресурсы в случаях, когда разработчики забывают использовать ссылки.