回答:
コールc_str()
を取得するためにconst char *
(LPCSTR
から)std::string
。
それはすべて名前にあります:
LPSTR
-(長い)文字列へのポインタ- char *
LPCSTR
-(長い)定数文字列へのポインタ- const char *
LPWSTR
-(長い)Unicode(ワイド)文字列へのポインタ- wchar_t *
LPCWSTR
-(長い)定数Unicode(ワイド)文字列へのポインタ- const wchar_t *
LPTSTR
-(長い)TCHARへのポインタ(UNICODEが定義されている場合はUnicode、定義されていない場合はANSI)文字列- TCHAR *
LPCTSTR
-(長い)定数TCHAR文字列へのポインタ- const TCHAR *
名前のL(長い)部分は無視してかまいません。これは、16ビットWindowsからの持ち越しです。
これらは、以下に対応するMicrosoft定義のtypedefです。
LPCSTR:nullで終了するconst文字列へのポインタ char
LPSTR:nullで終了する文字列へのポインタchar
(多くの場合、バッファが渡され、「出力」パラメータとして使用されます)
LPCWSTR:nullで終了するconstの文字列へのポインタ wchar_t
LPWSTR:nullで終了する文字列へのポインターwchar_t
(多くの場合、バッファーが渡され、「出力」パラメーターとして使用されます)
std::string
aを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
次に文字列が変更または破棄されるまでのみ有効です。
a std::string
をaに変換するの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;
}
を使用LPWSTR
すると、それが指す文字列の内容を変更できます。LPCWSTR
あなたが使用すると、それが指している文字列の内容を変更できませんでした。
std::string s = SOME_STRING;
// get temporary LPSTR (not really safe)
LPSTR pst = &s[0];
// get temporary LPCSTR (pretty safe)
LPCSTR pcstr = s.c_str();
// convert to std::wstring
std::wstring ws;
ws.assign( s.begin(), s.end() );
// get temporary LPWSTR (not really safe)
LPWSTR pwst = &ws[0];
// get temporary LPCWSTR (pretty safe)
LPCWSTR pcwstr = ws.c_str();
LPWSTR
元の文字列へのポインタです。上記のサンプルを使用して関数から返すべきではありません。一時的LPWSTR
にならないようにするには、ヒープに元の文字列のコピーを作成する必要があります。以下のサンプルを確認してください。
LPWSTR ConvertToLPWSTR( const std::string& s )
{
LPWSTR ws = new wchar_t[s.size()+1]; // +1 for zero at the end
copy( s.begin(), s.end(), ws );
ws[s.size()] = 0; // zero at the end
return ws;
}
void f()
{
std::string s = SOME_STRING;
LPWSTR ws = ConvertToLPWSTR( s );
// some actions
delete[] ws; // caller responsible for deletion
}
MultiByteToWideChar
チャールズ・ベイリーが与えた答えが正しいものです。のでLPCWSTR
ためだけのtypedefでありconst WCHAR*
、widestr
どこのコード例で使用することができるLPWSTR
と予想される場合や、LPCWSTR
期待されています。
マイナーな調整の1つstd::vector<WCHAR>
は、手動で管理するアレイの代わりに使用することです。
// using vector, buffer is deallocated when function ends
std::vector<WCHAR> widestr(bufferlen + 1);
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), &widestr[0], bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// no need to delete; handled by vector
また、最初にワイド文字列を処理する必要がある場合は、のstd::wstring
代わりに使用できますstd::string
。Windows TCHAR
タイプで作業する場合は、を使用できますstd::basic_string<TCHAR>
。以下からの変換std::wstring
にLPCWSTR
またはからstd::basic_string<TCHAR>
にしてLPCTSTR
呼び出すだけの問題ですc_str
。ANSIとUTF-16文字の間で変更するときMultiByteToWideChar
(およびその逆WideCharToMultiByte
)が問題になります。
a std::string
をa に変換する最も簡単な方法LPWSTR
は私の意見です:
std::string
をaに変換しますstd::vector<wchar_t>
wchar_t
ベクトルの最初のアドレスを取得します。std::vector<wchar_t>
には、とのような2つの反復子を使用するテンプレート化されたctorがstd::string.begin()
あり.end()
ます。wchar_t
ただし、これは各文字をに変換します。std::string
Unicode値がLatin-1値に似ているため、これがASCIIまたはLatin-1を含む場合にのみ有効です。CP1252または他のエンコーディングの文字が含まれている場合は、さらに複雑になります。次に、文字を変換する必要があります。
std::wstring
ですか?