Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

21.12.2013, 22:33. Просмотров 363. Ответов 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);
0
Миниатюры
wstring странное поведение после GetEnvironmentVariable  
Изображения
  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 22:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос wstring странное поведение после GetEnvironmentVariable (C++):

Странное поведение wstring - C++
Всем привет! Ребята, не могу понять такую ситуацию. Вставляю в wstring строку в позицию 0 таким образом ...

Странное поведение cout после объявления объекта класса - C++
List words; string strg; сin >> strg; сout << strg; Ничего не выведет, пока в поток вывода не отправится endl или \n. Если...

Странное поведение new - C++
Объясните почему оператор new выделяет неверное количество памяти? # include <iostream> using namespace std; char* interpitator( int...

Странное поведение - C++
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...

Странное поведение cin - C++
Перегружаю оператор ввода следующим образом: #include <iostream> using namespace std; class Vector2D { public: ...

Странное поведение в коде - C++
Есть два класса: ArrayList<T> и Array<T> (реализация в конце поста). И есть такой код: ArrayList<int> list = { 1, 2, 3 }; ...

3
Убежденный
Ушел с форума
Эксперт С++
15786 / 7223 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
21.12.2013, 23:17 #2
Цитата Сообщение от Giperion Посмотреть сообщение
C++
1
2
std::wstring* PathToFont = new std::wstring();
result = GetEnvironmentVariable(L"windir", (LPWSTR)PathToFont, 30);
Указатель на std::wstring и указатель на wchar * - не одно и то же.
Нельзя просто взять и насильно привести одно к другому.
Сделайте побайтовый дамп объекта std::wstring и посмотрите, что у него
лежит в первых байтах, там совсем не буфер.
1
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
21.12.2013, 23:42  [ТС] #3
Цитата Сообщение от Убежденный Посмотреть сообщение
Указатель на std::wstring и указатель на wchar * - не одно и то же.
Нельзя просто взять и насильно привести одно к другому.
Сделайте побайтовый дамп объекта std::wstring и посмотрите, что у него
лежит в первых байтах, там совсем не буфер.
Во блин... Спасибо, но можно тогда вопрос: а можно ли вообще использовать wstring в WinAPI, или там везде WCHAR'рирование нужно?
0
Миниатюры
wstring странное поведение после GetEnvironmentVariable   wstring странное поведение после GetEnvironmentVariable  
Убежденный
Ушел с форума
Эксперт С++
15786 / 7223 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.12.2013, 00:05 #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
такой гарантии не было, но по факту подавляющее большинство компиляторов
реализовывали класс строки именно так.
0
22.12.2013, 00:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2013, 00:05
Привет! Вот еще темы с ответами:

Странное поведение присваивания - C++
class Lexem { public: uint id; uint value; uint line; uint pos; bool operator==(int a){ return a...

Странное поведение string - C++
Здравствуйте. Сейчас я пытаюсь скомпилировать под Windows проект, который ранее писался под Linux. Делаю я это с помощью MinGW от...

Странное поведение транслятора - C++
В следуюшем примере код компилируется нормально, но объект класса b не содается (пробывал на Visual studio 10 и на Borland builder 5), что...

Странное поведение getline - C++
В программе в двух местах используеться getline. В первом случае все супер : string ownerName; getline (cin, ownerName); А во...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.