私はライブラリを使用していてstd::wstring
、その関数の 1 つから送信し、別のライブラリ_TCHAR []
に送信する必要があります。どうすれば変換できますか?
3 に答える
Unicode ビルドを使用していると仮定すると、必要なのは std::wstring.c_str() です。c_str() は、返される文字列が null で終了することを保証することに注意してください。
例えば
void func(const wchar_t str[])
{
}
std::wstring src;
func(src.c_str());
非 Unicode ビルドを使用している場合は、 WideCharToMultiByteを介して Unicode 文字列を非 Unicode 文字列に変換する必要があります。
ATL および MFC 文字列変換マクロを使用します。_UNICODE
これは、ANSI モードでコンパイルしているかどうかに関係なく機能します。
MFC を使用していない場合でも、これらのマクロを使用できます。次の例に示す 2 つの ATL ヘッダーを含めるだけです。
#include <string>
#include <Windows.h>
#include <AtlBase.h>
#include <AtlConv.h>
int main()
{
std::wstring myString = L"Hello, World!";
// Here is an ATL string conversion macro:
CW2T pszT(myString.c_str());
// pszT is now an object which can be used anywhere a `const TCHAR*`
// is required. For example:
::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);
return 0;
}
@Zach Sawが言ったように、Unicode のみをビルドする場合は を回避できますが、概念的には(a for )std::wstring.c_str()
を定義する方がよいため、この種の文字列をすべての Windows およびライブラリ関数で問題なく安全に使用できます。s 1 .tstring
typedef
std::basic_string<TCHAR>
TCHAR
追加の楽しみとして、TCHAR
s の他のすべての文字列関連の C++ 機能も定義し、変換関数std::string
/ std::wstring
<=>を作成する必要がありますtstring
。
幸いなことに、この作業はすでに完了しています。こことここを参照してください。
- s はコンパイル時にs またはsとして解決される
TCHAR *
ため、実際には、コンパイルされたライブラリ関数は実際には を期待できませんが、アイデアはわかりました。TCHAR
char
wchar_t