Скачать MetaTrader 5

MulDiv

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Проблемы с кодом? Загляни в документацию!
Ilya Malev
10143
Ilya Malev 2013.06.16 14:30 

Добрый день! В ветке английского форума, посвященной примеру МТ4-реализации обмена данными между терминалами с помощью Named Pipes (ветка https://www.mql5.com/en/forum/127032 код https://c.mql4.com/forum/2010/07/MT4NamedPipes.zip)

Используется такая конструкция

            // Read up to the maximum buffer size from the pipe. (The use of MulDiv() is an old trick from VB6 days for 
            // getting the address in memory of a string variable.)
            int BytesRead[1] = {0};
            ReadFile(glbPipe[PipeIndex], MulDiv(ReadBuffer, 1, 1), BufferLength, BytesRead, 0);

И функция ReadFile, вторый параметр которой в описании имеет тип LPVOID, объявляется как

   int ReadFile(int FileHandle, int BufferPtr, int BufferLength, int & BytesRead[], int PassAsZero);

Может ли кто-нибудь объяснить суть этой уловки и почему нельзя объявить второй параметр как string &. Спасибо. 

Dmitry Fedoseev
41178
Dmitry Fedoseev 2013.06.16 15:03  

Какой смысл разбираться во всех этих странностях?

Способ при котором работает есть? - Есть!

Можно объявить как стринг, но что от этого будет? Работать не будет. Разве этого недостаточно?

Вообще, с точки зрения философии очень интересный вопрос, есть о чем подумать - "Почему не работает, когда неправильно" 

Ilya Malev
10143
Ilya Malev 2013.06.16 15:16  
Integer:

Какой смысл разбираться во всех этих странностях?

 Ну как минимум для того, чтобы уметь потом сознательно применять в своих программах. И не хлопать глазами, если в какой-то момент это вдруг перестанет работать.

Alexander
2441
Alexander 2013.06.16 15:23  
Ant_TL:

 Ну как минимум для того, чтобы уметь потом сознательно применять в своих программах. И не хлопать глазами, если в какой-то момент это вдруг перестанет работать.

Для сознательного применения - https://www.mql5.com/ru/articles/1540
Ilya Malev
10143
Ilya Malev 2013.06.16 15:37  
Roger:
Для сознательного применения - https://www.mql5.com/ru/articles/1540

 Действительно, если указать параметр как обычный string, все работает. Я почему-то пробовал использовать string &. Поскольку обычный параметр типа string работает без наворотов, вопрос отменяется...

Комбинатор
15638
Комбинатор 2013.06.16 15:43  

Ant_TL:

Может ли кто-нибудь объяснить суть этой уловки и почему нельзя объявить второй параметр как string &. Спасибо.

Потому что string& это не передача нуль-стоки, а передача структуры, через которую реализована строка в mql4.

А передавать в функцию нужно именно указатель. Можно использовать описанный вами способ, можно использовать массивы, и строку не по ссылке, можно использовать memcpy.

Вариантов масса.

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий