Это определенные Microsoft определения типов, которые соответствуют:
LPCSTR: указатель на константную строку с нулевым символом в конце char
LPSTR: указатель на символьную строку с нулевым символом в конце char
(часто буфер передается и используется в качестве параметра вывода)
LPCWSTR: указатель на завершенную нулем строку const wchar_t
LPWSTR: указатель на строку с нулевым символом в конце wchar_t
(часто буфер передается и используется в качестве выходного параметра)
Чтобы "преобразовать" std::string
в LPCSTR, зависит от точного контекста, но обычно достаточно вызова .c_str()
.
Это работает.
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
Обратите внимание, что вы не должны пытаться делать что-то подобное.
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
Буфер, возвращаемый .c_str()
, принадлежит экземпляру std::string
и будет действителен только до следующего изменения или уничтожения строки.
Преобразовать std::string
в LPWSTR
сложнее. Желание LPWSTR
подразумевает, что вам нужен модифицируемый буфер, и вы также должны быть уверены, что понимаете, какую кодировку символов использует std::string
. Если std::string
содержит строку, использующую системную кодировку по умолчанию (здесь предполагается, что окна), тогда вы можете найти длину требуемого буфера широких символов и выполнить транскодирование, используя MultiByteToWideChar
(функция Win32 API).
* * Например, одна тысяча тридцать восемь
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;
}