35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
1

Правильная конвертация string в LPCWSTR?

29.10.2015, 21:23. Показов 1999. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет. Делаю вот так:
C++
1
2
3
string s_Path = "путь";
LPCWSTR l_Path;
l_Path = (LPCWSTR)s_Path_vir.c_str();
Через отладчик не показывается значение переменной l_Path, и я так понимаю что конвертация не правильная.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2015, 21:23
Ответы с готовыми решениями:

String и LPCWSTR
Здравствуйте, есть функция, показывающая дату создания файла и есть такая строчка: LPCWSTR fname1...

LPCWSTR и string
Я обычно пишу на C#, но вдруг решил поиграться с хуками, а тут без C++ никак :( (ну конечно можно,...

String в LPCWSTR
В общем сложил как правильно строку(для пути проверки папки),но теперь не могу её записать в...

LPCWSTR to std::string
Как конвертировать?

17
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
29.10.2015, 21:32 2
Цитата Сообщение от Randen Посмотреть сообщение
C++
1
string s_Path = "путь";
попробуйте так
C++
1
2
3
wstring s_Path = L"путь";
LPCWSTR l_Path;
l_Path = (LPCWSTR)s_Path_vir.data();
Добавлено через 2 минуты
хотя копировать адрес содержимого не советую, лучше скопировать само содержимое во вновь выделенную память.
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
29.10.2015, 21:34 3
Почему data()? Только c_str().
0
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
29.10.2015, 21:36  [ТС] 4
Kerry_Jr, в переменной s_Path лежит настоящий путь и добавлен нормальным образом. Суть в конвертации.
Вопрос не решен
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
29.10.2015, 21:37 5
Конкретнее. Что там не решено, какая ошибка?
0
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
29.10.2015, 21:39  [ТС] 6
nmcf, нет ошибки.
Значение переменной s_Path я могу посмотреть в отладчике, а переменной l_Path - нет. Поэтому я здесь)

Добавлено через 35 секунд
Собственно на этом куске кода перестает работать дальнейший код программы
0
DrOffset
29.10.2015, 21:39
  #7

Не по теме:

Цитата Сообщение от nmcf Посмотреть сообщение
Почему data()
По сути я с тобой согласен. Но с С++11 их поведение эквивалентно.

0
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
29.10.2015, 21:40  [ТС] 8
Может кто заодно подскажет как через MessageBoxW вывести нормальные символы, а то всегда кракозябры. С помощью неё и попробую посмотреть значение l_Path
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
29.10.2015, 21:44 9
C++
1
2
3
std::wstring s_Path = L"путь";
LPCWSTR l_Path = s_Path.c_str();
MessageBoxW(hwnd, l_Path, L"Caption", MB_OK);
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
29.10.2015, 21:46  [ТС] 10
nmcf, Caption выводит, а l_Path - кракозябры.

Я вот так делал:
C++
1
MessageBoxW(0, l_Path, LPCWSTR("Caption"), MB_OK);
Почему таким образом Caption - кракозябры?
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
29.10.2015, 21:49 11
Лучший ответ Сообщение было отмечено Randen как решение

Решение

Randen,
https://msdn.microsoft.com/en-... 85%29.aspx
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include <vector>
#include <string>
 
BOOL AnsiToUnicode16(CHAR const *in_Src, WCHAR *out_Dst, INT in_MaxLen)
{
    /* locals */
    INT lv_Len;
 
    // do NOT decrease maxlen for the eos
    if (in_MaxLen <= 0)
        return FALSE;
 
    // let windows find out the meaning of ansi
    // - the SrcLen=-1 triggers MBTWC to add a eos to Dst and fails if MaxLen is too small.
    // - if SrcLen is specified then no eos is added
    // - if (SrcLen+1) is specified then the eos IS added
    lv_Len = MultiByteToWideChar(CP_ACP, 0, in_Src, -1, out_Dst, in_MaxLen);
 
    // validate
    if (lv_Len < 0)
        lv_Len = 0;
 
    // ensure eos, watch out for a full buffersize
    // - if the buffer is full without an eos then clear the output like MBTWC does
    //   in case of too small outputbuffer
    // - unfortunately there is no way to let MBTWC return shortened strings,
    //   if the outputbuffer is too small then it fails completely
    if (lv_Len < in_MaxLen)
        out_Dst[lv_Len] = 0;
    else if (out_Dst[in_MaxLen-1])
        out_Dst[0] = 0;
 
    // done
    return TRUE;
}
 
int main()
{
    std::string s_Path = "путь";
    std::vector<WCHAR> l_Path(s_Path.size() + 1);
 
    AnsiToUnicode16(s_Path.c_str(), &l_Path[0], l_Path.size());
 
    MessageBoxW(0, &l_Path[0], L"Debug", MB_OK);
}
CP_ACP - The system default Windows ANSI code page. - т.е. в случае русской windows в std::string должна быть строка в cp1251.
1
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.10.2015, 21:50 12
Цитата Сообщение от Randen Посмотреть сообщение
Почему таким образом Caption - кракозябры?
Потому что LPCWSTR("Caption") означает "у меня тут строчка в восьмибитовой кодировке, но ты пиши в документы "UTF16"". Настоящая смена кодировки это куда-то в сторону std::wstring_convert смотреть надо.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
29.10.2015, 22:02  [ТС] 13
DrOffset, так преобразовывает правильно, и показывает тоже.
Но для дальнейшей работы программы нужен не вектор, а LPWSTR. Попробовал записать l_Path в файл после моего преобразование. И получил 0152A5A0.

Что не так-то?
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
29.10.2015, 22:05 14
Цитата Сообщение от Randen Посмотреть сообщение
для дальнейшей работы программы нужен не вектор, а LPWSTR
Ну ведь &l_Path[0] как раз и дает LPWSTR
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
29.10.2015, 22:09  [ТС] 15
Проблема решена. Всем спасибо!
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
29.10.2015, 22:17 16
Я не понял, зачем перекодировать строку, если можно сразу записать с L.
0
DrOffset
30.10.2015, 10:51
  #17

Не по теме:

Цитата Сообщение от nmcf Посмотреть сообщение
Я не понял, зачем перекодировать строку
Может быть это только в примере она у него в коде, а в реальности приходит откуда-то извне?

0
nmcf
30.10.2015, 11:09     Правильная конвертация string в LPCWSTR?
  #18

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
а в реальности приходит откуда-то извне
Надо так и объяснять тогда.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2015, 11:09

Конвертировать string в LPCWSTR
Как nbg string конвертировать в LPCWSTR и наоборот?

std::string конвертировать в LPCWSTR
Как преобразовать std::string в LPCWSTR?Желательно не сложной операцией?Читал про метод c_str(),но...

Преобразование переменной string к LPCWSTR
День добрый! Столкнулся с проблемой преобразования string к LPCWSTR. Если используем строку в...

string & LPCWSTR
Я вызываю функцию ShellExecute. Один из параметров функции - параметры приложения....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru