Questi sono Microsoft typedefs definiti corrispondenti:
LPCSTR: puntatore a zero finale const string di char
LPSTR: puntatore null stringa char terminato di char
(spesso un buffer viene passato e utilizzato come un param 'uscita')
LPCWSTR: puntatore alla stringa Null terminata del const wchar_t
LPWSTR: puntatore su null t stringa erminated di wchar_t
(spesso un buffer viene passato ed utilizzato come parametro 'uscita')
"convertire" un std::string
ad un LPCSTR dipende dal contesto esatta ma solitamente chiamata .c_str()
è sufficiente.
Questo funziona.
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
Si noti che non si dovrebbe tentare di fare qualcosa di simile.
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
Il buffer restituito da .c_str()
è di proprietà l'istanza std::string
e saranno validi solo finché la corda sia modificata o distrutta.
Per convertire un std::string
in un LPWSTR
è più complicato. La richiesta di un LPWSTR
implica che è necessario un buffer modificabile e devi anche essere sicuro di aver compreso quale codifica dei caratteri utilizza il codice std::string
. Se std::string
contiene una stringa che utilizza la codifica predefinita di sistema (presupponendo windows, qui), quindi è possibile trovare la lunghezza del buffer di caratteri wide richiesto ed eseguire la transcodifica utilizzando MultiByteToWideChar
(una funzione API Win32).
ad es.
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 di scarsa importanza: su x64 LPCSTR sarebbe un puntatore a 64 bit su una stringa (costante) con terminazione null. – Joel