Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Конвертировать string в LPCTSTR


Автор: Agentx86 2.6.2009, 10:30
Есть функция в котой входная переменная типа LPCTSTR в нее нужно передать переменную типа string. Выскакивает вот такая ошибка cannot convert parameter 2 from 'std::string' to 'LPCTSTR'

Автор: GremlinProg 2.6.2009, 10:41
метод std::string::c_str дает LPCSTR
но он не совместим с LPCTSTR в общем случае

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

Автор: Agentx86 2.6.2009, 11:44
Цитата(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)
.................

Код работает для английских символовов и цифр. Вместо русских букв квадратики.

Автор: GremlinProg 2.6.2009, 12:01
Код

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);

Автор: Agentx86 2.6.2009, 15:26
Цитата(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());

Автор: GremlinProg 2.6.2009, 16:51
Цитата(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 то конвертировать вообще ничего не придется

Автор: Rififi 2.6.2009, 22:35
Код
#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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)