Estos son Microsoft typedefs definidos que corresponden a:
LPCSTR: puntero a cadena terminada en nulo const de char
LPSTR: puntero a null cadena Char terminado de char
(a menudo un tampón se pasa y se utiliza como una 'salida' param)
LPCWSTR: puntero en null cadena terminada const wchar_t
LPWSTR: puntero a nulo t erminated cadena de wchar_t
(a menudo se pasa un tampón y se utilizó como parámetro 'salida')
"convertir" a un std::string
a un LPCSTR depende del contexto exacto, pero por lo general llamando .c_str()
es suficiente.
Esto funciona.
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
Tenga en cuenta que no debe intentar hacer algo como esto.
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
El búfer devuelto por .c_str()
es propiedad de la std::string
instancia y sólo será válida hasta que la cuerda está próxima modificado o destruido.
Para convertir un std::string
en un LPWSTR
es más complicado. Querer un LPWSTR
implica que necesita un búfer modificable y también necesita asegurarse de comprender qué codificación de caracteres está usando el std::string
. Si el std::string
contiene una cadena utilizando la codificación predeterminada del sistema (asumiendo ventanas, aquí), entonces puede encontrar la longitud del búfer de caracteres anchos requerido y realizar la transcodificación usando MultiByteToWideChar
(una función API de Win32).
p. Ej.
void f(const std:string& instr)
{
// Assumes std::string is encoded in the current Windows ANSI codepage
int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), NULL, 0);
if (bufferlen == 0)
{
// Something went wrong. Perhaps, check GetLastError() and log.
return;
}
// Allocate new LPWSTR - must deallocate it later
LPWSTR widestr = new WCHAR[bufferlen + 1];
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), widestr, bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// Do something with widestr
delete[] widestr;
}
Punto minúsculo: en x64 LPCSTR sería un puntero de 64 bits a una cadena (nula) terminada en nulo. – Joel