Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
#1

wstring странное поведение после GetEnvironmentVariable - C++

21.12.2013, 22:33. Просмотров 330. Ответов 3
Метки нет (Все метки)

Есть юникодовская строка. После GetEnvironmentVariable, строка становится L"C:/windows"(и это прекрасно показывает окно сообщения), но студия говорит, что там просто /windows. А после append заменяется на "C:/Fonts", т.е. стирается "/windows".
Скриншоты и код прилагаются.

C++
1
2
3
4
5
6
7
8
    std::wstring* PathToFont = new std::wstring();
    result = GetEnvironmentVariable(L"windir", (LPWSTR)PathToFont, 30);
    if (result == 0)
    {
        ShowError(L"Ошибка при получений каталога Microsoft Windows");
    }
    PathToFont->append(L"/Fonts");
    MessageBox(NULL, (LPWSTR)PathToFont, L"Info", MB_OK | MB_ICONINFORMATION);
Миниатюры
wstring странное поведение после GetEnvironmentVariable  
Изображения
  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 22:33     wstring странное поведение после GetEnvironmentVariable
Посмотрите здесь:

Странное поведение (сдвиг) C++
C++ Странное поведение транслятора
C++ Странное поведение
Странное поведение wstring C++
странное поведение указателя C++
Странное поведение new C++
Странное поведение cout после объявления объекта класса C++
Странное поведение указателя C++
Странное поведение присваивания C++
C++ Странное поведение программы
C++ Странное поведение указателей
Странное поведение cin C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15099 / 6794 / 1073
Регистрация: 02.05.2013
Сообщений: 11,105
Завершенные тесты: 1
21.12.2013, 23:17     wstring странное поведение после GetEnvironmentVariable #2
Цитата Сообщение от Giperion Посмотреть сообщение
C++
1
2
std::wstring* PathToFont = new std::wstring();
result = GetEnvironmentVariable(L"windir", (LPWSTR)PathToFont, 30);
Указатель на std::wstring и указатель на wchar * - не одно и то же.
Нельзя просто взять и насильно привести одно к другому.
Сделайте побайтовый дамп объекта std::wstring и посмотрите, что у него
лежит в первых байтах, там совсем не буфер.
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
21.12.2013, 23:42  [ТС]     wstring странное поведение после GetEnvironmentVariable #3
Цитата Сообщение от Убежденный Посмотреть сообщение
Указатель на std::wstring и указатель на wchar * - не одно и то же.
Нельзя просто взять и насильно привести одно к другому.
Сделайте побайтовый дамп объекта std::wstring и посмотрите, что у него
лежит в первых байтах, там совсем не буфер.
Во блин... Спасибо, но можно тогда вопрос: а можно ли вообще использовать wstring в WinAPI, или там везде WCHAR'рирование нужно?
Миниатюры
wstring странное поведение после GetEnvironmentVariable   wstring странное поведение после GetEnvironmentVariable  
Убежденный
Системный программист
Эксперт С++
15099 / 6794 / 1073
Регистрация: 02.05.2013
Сообщений: 11,105
Завершенные тесты: 1
22.12.2013, 00:05     wstring странное поведение после GetEnvironmentVariable #4
Можно. Например, выделить буфер, прочесть в него данные, а
затем выполнить присваивание: string = buff. Или как-то так:
C++
1
2
3
4
5
DWORD const BuffSize = 1000;
std::wstring SystemRoot;
SystemRoot.resize(BuffSize);
 
GetEnvironmentVariableW(L"SystemRoot", &SystemRoot[0], BuffSize);
В C++11 гарантируется, что элементы std::string располагаются в памяти
последовательно (пункт стандарта сейчас не приведу). В C++98 и C++03
такой гарантии не было, но по факту подавляющее большинство компиляторов
реализовывали класс строки именно так.
Yandex
Объявления
22.12.2013, 00:05     wstring странное поведение после GetEnvironmentVariable
Ответ Создать тему
Опции темы

Текущее время: 02:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru