MT5 build 1035 (x64) Вызов функции из DLL, возвращающей строку wchar_t* - страница 3

 
stringo:

Вы так и не поняли. Я указал на проблему именно в Вашем коде

В текущей реализации Вашего компилятора просто возвращается ссылка на область константных строк. Область константных строк в текущей реализаци Вашего компилятора постоянно загружена в память и постоянно доступна.

Повторяю - это именно благодаря текущей реализации Вашего компилятора, которая несколько противоречит стандарту C++, ибо Вы оперируете с автоматическими локальными переменными, время жизни которых - от момента объявления до выхода из блока.

Компилятор MSVC++ противоречит стандарту C++... гениально.

Любой С-код компилируется в машкод, где любая строковая константа и есть адрес. И будет она существовать в сегменте данных с момента загрузки DLL до момента высвобождения памяти.

А то что она (константа) используется в функции так сказать "локально", это не значит что она там определяется фактически. Декомпилируйте DLL и сами увидите.

Но это уже совсем другая история. 

 
elugovoy:

Компилятор MSVC++ противоречит стандарту C++... гениально.

Любой С-код компилируется в машкод, где любая строковая константа и есть адрес. И будет она существовать в сегменте данных с момента загрузки DLL до момента высвобождения памяти.

А то что она (константа) используется в функции так сказать "локально", это не значит что она там определяется фактически. Декомпилируйте DLL и сами увидите.

Но это уже совсем другая история. 

Запросто. Нет ни одного промышленного компилятора, который соответствует стандарту на 100 процентов.

В данном случае противоречие лишь в том, что ссылка осталась жива. Но я не удивлюсь, если в очередной реализации какого-нибудь MSVC 2015 будет реализован garbage collection, который будет удалять память, на которую больше никто не ссылается.

А вот теперь Вы скажите, где проблема в нашем коде?

MT4_EXPFUNC wchar_t* __stdcall GetStringValue(wchar_t *spar)
  {
   wprintf(L"Wide char string was received: \"%s\"\n",spar);
   return(spar);
  }

пальчиком ткните?

 
stringo:

Запросто. Нет ни одного промышленного компилятора, который соответствует стандарту на 100 процентов.

В данном случае противоречие лишь в том, что ссылка осталась жива. Но я не удивлюсь, если в очередной реализации какого-нибудь MSVC 2015 будет реализован garbage collection, который будет удалять память, на которую больше никто не ссылается.

А вот теперь Вы скажите, где проблема в нашем коде?

пальчиком ткните?

Если да кабы... тема открыта по конкретной проблеме. Впервые вижу чтобы модератор сам в оффтопе оказывался.

За проблемы в коде не я начал говорить и не утверждал о существовании таковых изначально. 

 
elugovoy:

А вот Ваш *spar = L"content" как раз таки не станет переопределять длину строки, и если исходная строка была 3 символа (6 байт), то "content" - 14 байт будет затирать собой еще 8 байт.

Я же написал: "на скорую руку". Указал, что на самом деле содержимое строки записывается совсем не так. Смысл примера был в том, чтобы показать передачу строку по ссылке. То есть сама строка ко входу в функцию уже должна где-то существовать. Если же вернуть просто ссылку на строку, то получим проблему, которую Вы и подняли - ошибка доступа. Ведь строка, которую вернула функция GetStringValue, существовала только во время работы функции. После окончания исполнения функции строка уничтожается и на выходе получаем указатель на "молоко".

 
Scriptong:

Я же написал: "на скорую руку". Указал, что на самом деле содержимое строки записывается совсем не так. Смысл примера был в том, чтобы показать передачу строку по ссылке. То есть сама строка ко входу в функцию уже должна где-то существовать. Если же вернуть просто ссылку на строку, то получим проблему, которую Вы и подняли - ошибка доступа. Ведь строка, которую вернула функция GetStringValue, существовала только во время работы функции. После окончания исполнения функции строка уничтожается и на выходе получаем указатель на "молоко".

Это не является причиной проблемы, о которой я говорю. Еще раз повторюсь, проблема в том что MT5 x64 build 1035 принимает неизвестно что вместо указателя на строку или же интерпретирует х.з. как этот указатель.

В реальном проекте все переменные, возвращаемые в MQL объявлены глобально, выделение памяти под контролем. Стандартный пример от MQ (писал выше) дает ту же ошибку.

Котлеты отдельно, мухи - отдельно. не нужно смешивать.

Дальнейшие дискуссии уже бессмысленны, т.к. от сервисдеск получен ответ.