В этом билде улучшали совместимость MQL5 с 64 битным кодом и внесли несколько ошибок при передаче сложных типов в DLL.
Завтра с утра исправим. Извините за ошибку.
В этом билде улучшали совместимость MQL5 с 64 битным кодом и внесли несколько ошибок при передаче сложных типов в DLL.
Завтра с утра исправим. Извините за ошибку.
Мы проверяли передачу структуры 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" ?
- 2010.05.26
- Andrey Voytenko
- www.mql5.com
У меня тоже в 241 и в 242 не работает код
Мы проверяли передачу структуры MqlTick в dll и не обнаружили описываемой Вами проблемы.
Вы, кстати, не сказали, что означает "не могу получить структуру тика". Что же Вы получаете?
Да, действительно, когда я начал перепроверять у меня получилось вот что: если передавать указатель на тик в функцию первым параметром, то конвертится без проблем, а если, например, третьим, то выкидывает исключение. Не могу сообразить почему так происходит, поэтому накидал демо-проект всего этого (в аттаче)
Для работы нужен .net framework 2.0 и vs 2008 для открытия проекта
Что такое "не работает код"? Вы можете привести более конкретные факты?
Мне сложно вычислить в чем именно проблема
В этом посте 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"
Спасибо. Будем разбираться
Спасибо. Будем разбираться
Билд 243 - все ОК
> И по ходу дела еще вопрос )))
> int GetQuery (string& s); - передает ссылку на стринг
> int AddReplay (string s); - создает новый экземпляр стринга, копирует содержимое, передает ссылку, потом удаляет копию
> Я правильно понимаю механизм?
> Если да, тогда выгоднее передавать в "свои" функции стринги вот так "string& s" ?
> int GetQuery (string& s); - передает ссылку на стринг
> int AddReplay (string s); - создает новый экземпляр стринга, копирует содержимое, передает ссылку, потом удаляет копию
> Я правильно понимаю механизм?
> Если да, тогда выгоднее передавать в "свои" функции стринги вот так "string& s" ?
Да, абсолютно правильно. И создание копий очень дорогая функция.
Но если string s передается внутри MQL5 кода, то компилятор будет (еще не включено) анализировать состояние неизменности параметра и автоматически использовать передачу ссылки (string &s) вместо копии. Этот прозрачный механизм позволит автоматически экономить ресурсы в случаях, когда разработчики забывают использовать ссылки.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ситуация вот в чем: У меня есть 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? или сам дурак? :)