Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
1

Как из string получить LPCTSTR?

10.11.2016, 01:53. Просмотров 5223. Ответов 12
Метки нет (Все метки)

как из string получить LPCTSTR?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2016, 01:53
Ответы с готовыми решениями:

Не существует подходящей функции для преобразования из std::string в LPCTSTR
Ошибка: не существует подходящей функции для преобразования из std::string в LPCTSTR. Как это...

Как преобразовать std::string в LPCTSTR?
Вопрос задан в названии темы.

String^ to LPCTSTR
Сразу извиняюсь, может, за глупый вопрос. Осваивать с++ (VC++2008) начал недавно. Как лучше...

Как из unordered_map<string, string> получить значение по ключу
У меня есть такая штука. Как мне из нее получить значение по ключу? Я вот хочу написать string str...

12
С чаем беда...
Эксперт CЭксперт С++
8027 / 3918 / 1082
Регистрация: 18.10.2014
Сообщений: 8,405
10.11.2016, 02:22 2
Цитата Сообщение от tupen_T_T Посмотреть сообщение
как из string получить LPCTSTR?
Это зависит от того, что скрывается за LPCTSTR. Когда это LPCSTR - легко, а когда это LPCWSTR, то придется повозиться.

Откуда и зачем у вас вообще взялось LPCTSTR и нужно ли оно вам? Вот на этот вопрос надо бы сначала ответить.
0
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
10.11.2016, 02:30  [ТС] 3
TheCalligrapher,
string a = "c:";
if (GetDriveType(a(?)) == DRIVE_FIXED)

Добавлено через 44 секунды
if (GetDriveType((LPCTSTR)diski[0].c_str()) == DRIVE_FIXED)

а по другому можно? и какой лучше вариант?
0
С чаем беда...
Эксперт CЭксперт С++
8027 / 3918 / 1082
Регистрация: 18.10.2014
Сообщений: 8,405
10.11.2016, 02:33 4
Цитата Сообщение от tupen_T_T Посмотреть сообщение
а по другому можно? и какой лучше вариант?
Если ваша программа всегда будет компилироваться только в режиме "обычных" символов, т.е. LPCTSTR всегда будет просто LPCSTR (что есть const char *), то тогда просто

C++
1
if (GetDriveType(a.c_str()) == DRIVE_FIXED)
и все.
0
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
10.11.2016, 02:49  [ТС] 5
TheCalligrapher, пишет что const char* несовместим с параметром LPCWSTR
0
С чаем беда...
Эксперт CЭксперт С++
8027 / 3918 / 1082
Регистрация: 18.10.2014
Сообщений: 8,405
10.11.2016, 03:03 6
Цитата Сообщение от tupen_T_T Посмотреть сообщение
пишет что const char* несовместим с параметром LPCWSTR
Это говорит о том, что вы компилируете свою программу в режиме UNICODE. Тут уж вы сами сначала определитесь, что именно вы хотите получить.

Либо продолжайте компилироваться в UNICODE, но тогда прекратите пользоваться string, а используйте wstring

C++
1
2
3
wstring a = L"c:";
if (GetDriveType(a.c_str()) == DRIVE_FIXED)
  ...
Либо лезьте в настройки проекта и переводите вашу компиляцию в режим обычных символов (т.е. выключайте UNICODE) и продолжайте пользоваться string.
0
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
10.11.2016, 03:27  [ТС] 7
TheCalligrapher, тупенький вопрос: если я включу получившийся exe на другом компе с дугой системой, она же сработает правильно, так?
и можно как нибудь универсально?
0
С чаем беда...
Эксперт CЭксперт С++
8027 / 3918 / 1082
Регистрация: 18.10.2014
Сообщений: 8,405
10.11.2016, 03:57 8
Цитата Сообщение от tupen_T_T Посмотреть сообщение
сли я включу получившийся exe на другом компе с дугой системой, она же сработает правильно, так?
Во-первых, нет.

Во-вторых, не совсем ясно, о каком "получившемся exe" идет речь. Однако если ваш вариант из поста #3 с насильным приведением к LPCTSTR не работатет, то работать он не будет нигде.
0
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
10.11.2016, 05:42  [ТС] 9
TheCalligrapher, оказывается он не работает
а есть способ сделать универсальный способ?
0
С чаем беда...
Эксперт CЭксперт С++
8027 / 3918 / 1082
Регистрация: 18.10.2014
Сообщений: 8,405
10.11.2016, 06:47 10
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Цитата Сообщение от tupen_T_T Посмотреть сообщение
а есть способ сделать универсальный способ?
"Универсальный" способ чего? И "универсальный" по отношению к чему?

Если exe работает, то от будет работать везде (разумеется, не выходя за рамки конкретной ОС). Поэтому компилируйте в режиме UNICODE, получайте exe и используйте его где угодно. Вот и вся универсальность.

А если вам зачем-то захотелось универсальности на стадии компиляции (между версией с обычными символами и UNICODE), то вся эта каша с буквой T в названиях типов именно на то и ориентирована. Везде все надо будет делать через T-типы и Т-функции. Вместо char везде использовать TCHAR. Все строковые литералы записывать как _T("Hello World"). Вместо sprintf везде использовать _stprintf. Явно пользоваться string или wstring нельзя, а надо будет сделать

C++
1
2
3
4
5
#ifdef UNICODE
  typedef std::wstring tstring;
#else // UNICODE
  typedef std::string tstring;
#endif // UNICODE
и пользоваться везде именно tstring. И так далее, и тому подобное.
2
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
11.11.2016, 02:41  [ТС] 11
TheCalligrapher, спасибо)

Добавлено через 12 часов 25 минут
TheCalligrapher, а давайте добьем тему) c const понятно теперь, а как из string получить LPSTR?
ну и из wstring - LPWSTR
0
С чаем беда...
Эксперт CЭксперт С++
8027 / 3918 / 1082
Регистрация: 18.10.2014
Сообщений: 8,405
11.11.2016, 03:09 12
Лучший ответ Сообщение было отмечено tupen_T_T как решение

Решение

Цитата Сообщение от tupen_T_T Посмотреть сообщение
а как из string получить LPSTR? ну и из wstring - LPWSTR
В этой области спецификация stirng/wstring постоянно меняется и я уж не знаю, к чему все это придет.

Можно получить указатель на начало строки как &str[0]. Стандарт гарантирует, что строка хранится непрерывно.

Однако в С++14 нет прямой гарантии, что завершающий '\0' хранится непрерывно с основной строкой. Но в то же время требуется, чтобы c_str() и data() выполнялись за константное время, что как бы неявно обязывает хранить завершающий '\0' непрерывно. (С++17 вроде будет это гарантировать)

Поэтому модифицировать строку через LPSTR/LPWSTR, полученный как &str[0], вроде бы и можно, пока не делается попытки модифицировать завершающий '\0'. И при этом надо помнить, что помещение в середину строки значения '\0' не будет автоматически влиять на str.size().

В общем я бы пока не совался грязными руками в строку через LPSTR/LPWSTR. Лучше используйте посторонний буфер для LPSTR/LPWSTR, а потом присваивайте его в строку.
1
0 / 0 / 0
Регистрация: 12.04.2016
Сообщений: 75
11.11.2016, 04:41  [ТС] 13
TheCalligrapher, спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2016, 04:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

int->LPCTSTR && char->LPCTSTR
Подскажите как преобразовать int в LPCTSTR и char в LPCTSTR? Добавлено через 54 минуты Для int...

Как сформировать строку LPCTSTR?
Как сформировать строку LPCTSTR? Раньше я это делал с помощью wsprintfA, но он не хавает...

как преобразовать из ULONGLONG в LPCTSTR?
Здрасте! Хоxу вывести размер файла в List Control (MFC). Не могу преобразовать ULONGLONG в...

Как преобразовать LPCVOID на LPCTSTR
Здравствуйте можете помочь с программой в в нём выдает ошибку о том что нельзя преобразовать тип...


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

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

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