MulDiv

 

Добрый день! В ветке английского форума, посвященной примеру МТ4-реализации обмена данными между терминалами с помощью Named Pipes (ветка https://www.mql5.com/en/forum/127032 код https://c.mql5.com/mql4/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 &. Спасибо. 

 

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

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

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

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

 
Integer:

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

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

 
Ant_TL:

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

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

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

 

Ant_TL:

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

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

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

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