Como posso converter um std::string
para LPCSTR
? Além disso, como posso converter umstd::string
para LPWSTR
?
Estou totalmente confuso com estes LPCSTR
LPSTR
LPWSTR
eLPCWSTR
.
São LPWSTR
e LPCWSTR
iguais?
str.c_str()
fornece um const char *
, que é um LPCSTR
(Ponteiro longo para STRing constante) - significa que é um ponteiro para uma 0
string terminada de caracteres. W
significa string larga (composta de em wchar_t
vez de char
).
Ligue
c_str()
para obter umconst char *
(LPCSTR
) de astd::string
.Está tudo no nome:
LPSTR
- ponteiro (longo) para string -char *
LPCSTR
- ponteiro (longo) para string constante -const char *
LPWSTR
- ponteiro (longo) para string Unicode (larga) -wchar_t *
LPCWSTR
- ponteiro (longo) para string Unicode (ampla) constante -const wchar_t *
LPTSTR
- ponteiro (longo) para TCHAR (Unicode se UNICODE for definido, ANSI se não) string -TCHAR *
LPCTSTR
- ponteiro (longo) para string TCHAR constante -const TCHAR *
Você pode ignorar a parte L (longa) dos nomes - é um resquício do Windows de 16 bits.
fonte
Estes são typedefs definidos pela Microsoft que correspondem a:
LPCSTR: ponteiro para string const terminada em nulo de
char
LPSTR: ponteiro para string de caracteres terminada em nulo de
char
(geralmente um buffer é passado e usado como um parâmetro de 'saída')LPCWSTR: ponteiro para string terminada em nulo de const
wchar_t
LPWSTR: ponteiro para string terminada em nulo de
wchar_t
(geralmente um buffer é passado e usado como um parâmetro de 'saída')Para "converter" a
std::string
em um LPCSTR depende do contexto exato, mas normalmente a chamada.c_str()
é suficiente.Isso funciona.
Observe que você não deve tentar fazer algo assim.
O buffer retornado por
.c_str()
pertence àstd::string
instância e só será válido até a próxima modificação ou destruição da string.Converter a
std::string
em aLPWSTR
é mais complicado. Querer umLPWSTR
implica que você precisa de um buffer modificável e também precisa ter certeza de que entende qual codificação de caracteres ostd::string
está usando. Se ostd::string
contém uma string usando a codificação padrão do sistema (assumindo janelas, aqui), então você pode encontrar o comprimento do amplo buffer de caracteres necessário e realizar a transcodificação usandoMultiByteToWideChar
(uma função API do Win32).por exemplo
fonte
Usando
LPWSTR
você pode alterar o conteúdo da string para onde ela aponta. UsandoLPCWSTR
você não pode alterar o conteúdo da string para onde ela aponta.LPWSTR
é apenas um ponteiro para a string original. Você não deve retorná-lo da função usando o exemplo acima. Para não ser temporário,LPWSTR
você deve fazer uma cópia da string original na pilha. Confira o exemplo abaixo:fonte
A
MultiByteToWideChar
resposta que Charles Bailey deu é a correta. ComoLPCWSTR
é apenas um typedef paraconst WCHAR*
,widestr
no código de exemplo ele pode ser usado sempre que umLPWSTR
for esperado ou onde umLPCWSTR
for esperado.Um pequeno ajuste seria usar em
std::vector<WCHAR>
vez de uma matriz gerenciada manualmente:Além disso, se você precisar trabalhar com strings largas para começar, poderá usar em
std::wstring
vez destd::string
. Se você quiser trabalhar com oTCHAR
tipo do Windows , você pode usarstd::basic_string<TCHAR>
. A conversão destd::wstring
paraLPCWSTR
ou destd::basic_string<TCHAR>
paraLPCTSTR
é apenas uma questão de ligarc_str
. É quando você muda entre ANSI e UTF-16 caracteres queMultiByteToWideChar
(e seu inversoWideCharToMultiByte
) entra em cena.fonte
A conversão é simples:
std :: string str; LPCSTR lpcstr = str.c_str ();
fonte
A conversão é simples:
Uma coisa a ter cuidado aqui é que c_str não retorna uma cópia de myString, mas apenas um ponteiro para a string de caracteres que std :: string envolve. Se você quiser / precisar de uma cópia, você mesmo precisará fazer uma usando o strcpy.
fonte
A maneira mais fácil de converter a
std::string
em aLPWSTR
é, em minha opinião:std::string
em umstd::vector<wchar_t>
wchar_t
no vetor.std::vector<wchar_t>
tem um ctor modelado que terá dois iteradores, como os iteradoresstd::string.begin()
e.end()
. Nowchar_t
entanto, isso converterá cada char em um . Isso só é válido sestd::string
contiver ASCII ou Latin-1, devido à forma como os valores Unicode se assemelham aos valores Latin-1. Se contiver CP1252 ou caracteres de qualquer outra codificação, é mais complicado. Em seguida, você precisará converter os personagens.fonte
std::wstring
?myString é a string de entrada e lpSTR é seu equivalente LPSTR .
fonte