Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертировать string в LPCTSTR 
V
    Опции темы
Agentx86
Дата 2.6.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Есть функция в котой входная переменная типа LPCTSTR в нее нужно передать переменную типа string. Выскакивает вот такая ошибка cannot convert parameter 2 from 'std::string' to 'LPCTSTR'
PM MAIL   Вверх
GremlinProg
Дата 2.6.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



метод std::string::c_str дает LPCSTR
но он не совместим с LPCTSTR в общем случае

эта тема подробно обсуждалась: http://forum.vingrad.ru/forum/topic-256580...l/_t/index.html



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Agentx86
Дата 2.6.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Цитата(GremlinProg @  2.6.2009,  10:41 Найти цитируемый пост)
метод std::string::c_str дает LPCSTR
но он не совместим с LPCTSTR в общем случае

эта тема подробно обсуждалась: http://forum.vingrad.ru/forum/topic-256580...l/_t/index.html


Можете подробнее объяснить или тыкнуть пальцем туда, что надо почитать для решения моей проблемы.
Я сейчас сделал следующее объявил вот такие функции и вызвал их вот так.
Код

int MyStrLength(char * Virable)
{
    return(strlen(Virable));
};
int MyStrLength(string Virable)
{
    return(Virable.length());
};

template <class ConvertToType,class ConvertType> 
ConvertToType  Converte (ConvertToType OutVirable,ConvertType InVirable )
{
    int i = 0;
    for ( i ; i<MyStrLength(InVirable);i++)
    {
        OutVirable[i] = InVirable[i];
    }
    OutVirable[i] = 0;
    return OutVirable;
};

...................
string str;

LPTSTR title = new TCHAR[str.length()+1];
Converte(title,str)
.................

Код работает для английских символовов и цифр. Вместо русских букв квадратики.
PM MAIL   Вверх
GremlinProg
Дата 2.6.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Код

int MyStrLength(LPCTSTR Virable)
{
    return(_tcslen(Virable));
};
...
#if defined(UNICODE) || defined(_UNICODE)
#define _tstring wstring
#else
#define _tstring string
#endif
...
std::_tstring str;
...
Converte(title,str.c_str());


а int MyStrLength(string Virable) - не нужен

но тут я просто не понимаю смысла метода Converte
если нужно одно- или двух-байтовую строку преобразовать к соглашению, принятому в проекте: LPTSTR, то для этого есть _stprintf

_stprintf(lpszBuffer,_T("%hs"),lpszMultiByteString);
_stprintf(lpszBuffer,_T("%ws"),lpszWideCharString);


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Agentx86
Дата 2.6.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Цитата(GremlinProg @  2.6.2009,  12:01 Найти цитируемый пост)
если нужно одно- или двух-байтовую строку преобразовать к соглашению, принятому в проекте: LPTSTR, то для этого есть _stprintf

_stprintf(lpszBuffer,_T("%hs"),lpszMultiByteString);
_stprintf(lpszBuffer,_T("%ws"),lpszWideCharString); 


Большое спасибо за подсказку. Решил проблему
char strok[255];
wsprintf((LPWSTR)strok,_T("%hs"),it->getTitle().c_str());
PM MAIL   Вверх
GremlinProg
Дата 2.6.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Agentx86 @  2.6.2009,  17:26 Найти цитируемый пост)

char strok[255];
wsprintf((LPWSTR)strok,_T("%hs"),it->getTitle().c_str());

 smile 
Код

#include <tchar.h>
...
TCHAR strok[255];
_stprintf(strok,_T("%hs"),it->getTitle().c_str());

и это только при том, что getTitle() возвращает std::string

а если везде использовать только std::_tstring, вместо std::string то конвертировать вообще ничего не придется


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Rififi
Дата 2.6.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



Код
#include <windows.h>
#include <string>
#include <strsafe.h>

HRESULT string_to_lpcstr(const std::string& s, CHAR* buf, size_t cchBufSize)
{
    return StringCchCopyA(buf, cchBufSize, s.c_str());
}

HRESULT string_to_lpcwstr(const std::string& s, WCHAR* buf, size_t cchBufSize)
{
    _locale_t loc = _create_locale(LC_ALL, "");
    const size_t needChars = _mbstowcs_l(NULL, s.c_str(), s.size(), loc);
    if (needChars > cchBufSize)
        return STRSAFE_E_INSUFFICIENT_BUFFER;
    _mbstowcs_l(buf, s.c_str(), needChars, loc);
    _free_locale(loc);
    return ERROR_SUCCESS;
}

#ifdef UNICODE
#define string_to_lpctstr string_to_lpcwstr
#else
#define string_to_lpctstr string_to_lpcstr
#endif

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.